1.B/S技术:(Brower/Server)浏览器与服务器:“程序完全部署在服务器上”
采取技术:“请求/相应模式”
流程:
2.C/S技术:(/Server)客户端与服务器
区别:
###URL(uniform resource locator):统一资源定位符
http://localhost:8080/news.index.html
(http:协议);
(localhost:主机IP地址:端口号)
(news:项目资源路径)
下载:可去对应的Tomcat官网,选择对应版本进行下载
作用:Tomcat本身为Apache jakarta的开源项目,主要为JSP和Servlet的容器
目录详情:
/bin
(存放各种平台下用于启动和停止Tomcat的脚本文件)
/conf
(存放Tomcat服务器的各种配置文件)
/lib
(存放Tomcat服务器所需的各种JAR文件)
/logs
(存放Tomcat的日志文件)
/temp
(Tomcat运行时用于存放临时文件)
/webapps
(当发布Web应用时,默认情况下会将Web应用的文件存放于此目录中)
/work
(Tomcat把由JSP生成的Servelet放于此目录下(如JSP文件sc生成后的java文件和class文件))
CATALINA_HOME,值为Tomcat的安装目录
path配置%CATALINA_HOME%bin
classpath配置%CATALINA_HOME%/lib/servlet-api.jar
注意:
(配置该变量主要用于手动部署,发布项目,后期集成开发工具会帮我们实现)
(Tomcat运行依赖JRE,确保已安装JRE并配置JRE_HOME环境变量,或针对已安装的JDK配置JAVA_HOME环境变量)
通过配置文件server.sml修改Tomcat端口号,默认为8080.注意修改后不要被其他应用程序占用
web目录:
Web应用的根目录,该目录下所有文件在客户端都可以访问(JSP,HTML等)
WEB-INF 存放应用使用的各种资源,该目录及子目录对客户端都是不可访问
/WEB-INF/classes 存放Web项目的所有的class文件
/WEB-INF/lib 存放Web应用使用的JAR文件
通过配置文件web.xml修改访问起始页,在welcome-file-list标签内
,按从上往下顺序,选择匹配的起始页,越靠前优先级越高
步骤:
编写Web应用的代码
在webapps目录下创建应用文件目录
将创建的页面复制到应用目录下
启动Tomcat服务并进行访问
重要步骤
项目创建,部署,发布详细流程
step1:new,找到dynamic web project
step2:在呼出窗口中进行如下操作
创建项目名,点击next
在点击
勾选生成web.xml文件,并将生成的目录位置改为WebRoot
step3:添加tomcat服务器,tomcat服务器可从官网进行下载 【file】–【new】-- 【server】,呼出界面
选择对应版本的tomcat服务器,点击 next
在对应界面内,进行如下顺序的操作,选择tomcat服务器所在的文 件目录,注意目录层级
在Servers面板中,可以找到对应tomcat服务器
双击Servers面板的tomcat服务器,进行如下配置并保存
step4:添加tomcat服务器库 选中项目,右键点击【properties】,找到java bulid path 呼出界面后,按箭头进行如下操作
找到指定版本的tomcat服务器,点击finish即可
最后到Order and Export界面中,勾选对应的包,apply and close即可
step5:在WebRoot路径下,创建jsp文件,在文件中随便打点东西测 试,如网页标签
step6:将web项目部署到tomcat服务器上 如图,在Servers界面中,右键,点击 【add and remove】,将需 要部署的项目部署到服务器上
注意
相关设置
JSP编码格式设置
【window】–【preferences】,搜索JSP,进行如下操作,最后 apply and close即可
1.无法访问网页:
可能原因:服务器没有开启
2.404
可能原因:1.URL路径有误
2.文件放置位置有误,如放在WEB-INF,WEB-INF中的文件客户端无法访问
3.项目没有部署到服务器上
本质:在HTMl中嵌入java脚本代码
页面内容:
1.静态内容:如常规的html代码
2.指令:page指令
语法<%@指令%>
小脚本:
语法:<%Java代码%>
表达式:
语法:<%= Java表达式%>
声明:
说明:可以用与定义成员变量或方法,供以后后面使用
语法:< ! 方 法 !方法 !方法>
注释
1.JSP注释:语法< − − − − -- -- −−−−>
注意:客户端不会显示
2.html注释:语法
welcome–>
注意:客户端会显示
3.单行注释:
语法: <%//代码%>
<%//int a=3;%>
4.多行注释:
语法:<%/代码/%>
<%/int a =3/%>
内置对象名称 | 说明 |
---|---|
out对象 | 用于向客户端输出数据 |
request | 主要用于处理客户端请求的数据信息 |
response | 用于响应客户端请求并向客户端输出信息 |
session | 用于记录会话状态 |
application | 类似于系统的全局变量,用于实现Web应用中的资源共享 |
1.作用:主要用于处理客户端请求
2.常用方法:
(1.String getParameter(String name):根据表单组件名称获取提交数据)
(2.String[] getParameterValues(String name):获取表单组件多个值时的请求数据)
(3.void setCharacterEncoding(String charset):指定每个请求的编码(限于表单中的post))
(4.RequestDispatcher getRequestDispatcher(String path):返回一个RequestDispatcher对象,该
对象的forward()方法用于转发请求
2.表单编码问题的解决:
1.POST方式:在小脚本中添加request.setCharacterEncoding(“UTF-8”)
2.GET方式:方法1:在获取值时,对获取的值编码格式进行更改
案例:name = new String(name.getBytes(“ISO-8859-1”),“UTF-8”);
方法2:找到Tomcat中的conf里的server.xml中
在最后添加URLEncoding = “UTF-8”;
1.作用:用于响应客户端请求并向客户端输出信息
2.常用方法:
(1.void sendRedirect(String url)
案例:response.sendRedirect(“index.jsp”))
转发与重定向的区别:
转发:1.转发是在服务器端发挥作用,将同一请求在服务器资源之间进行传递
2.客户端浏览器的地址栏不会显示转向后的地址、
重定向:1.重定向是在客户端发挥作用,通过发送一个新的请求实现页面转向
2.在地址栏中可以显示转向后的地址
超链接的页面跳转:
html页:< a href =“xxx.jsp?属性1=“值”&属性2=“值””>xxx a>
控制处理页:
<%String 属性名 = request.getParameter(属性1);%>
会话:一个会话就是在一段时间内,一个客户端与Web服务器的一连串相关的交互过程
常用方法:
1.String getId():
获取sessionid
注意:同一个session对象sessionid相同
在浏览器中,默认一个浏览器窗口为一个session,在实际中,很多浏览器
实现了多窗口会话共享,如果需要移除该功能,可以去对应的浏览器内进行设置(根据不同浏览器)
2.void setMaxInactiveInterval(int interval)
设定session的非活动实际(会话对象的国过期时间)
单位:秒
其他设置session的非活动时间的方法:
方式1:可以在tomcat服务器中的web.xml文件中的如下位置,将对应的默认
时间改为指定的时间,默认时间为30分钟(单位:分钟)
方式2:在项目中的web.xml文件中,设置如下图所示代码
3.int getMaxInactiveInterval()
获取session的有效非活动时间(以秒为单位)
4.void invalidate()
设置session对象失效
5.void setAttribute(String key,Object value)
以key/value的形式保存对象值,一般用于保存用户的登录信息到session对象中
6.Object getAttribute(String key)
通过key获取对象值,该方法的返回值是一个Object,必须进行强制类型转换
7.void removeAttribute(String key)
从session中删除指定名称(key)所对应的对象
作用:多个页面中需要统一的业务处理。可利用include指令避免代码冗余
语法:
<%@ include file = “xx.jsp”%>
案例:
<%@ include file = “longin.jsp”%>
方法名称 | 说明 | 示例 |
---|---|---|
void setAttribute(String key,Object value) | 以key/value的形式将对象存储到application中 | application.setAttribute(“app”, app); |
Object getAttribute(String key) | 通过key获取application中存储的对象 | application.getAttribute(“app”) |
String getRealPath(String) | 返回相对路径 |
1.page 作用域
1.表示当前页。
2.page作用域可以使用pageContext对象的setAttribute()和getAttribute()方法访问。
3.page作用域在客户端每次请求JSP页面时创建,在服务器发送响应时创建,在服务器发送响应或
请求转发到其他页面或资源后失效
2.request 作用域,
1.与客户端的请求绑定在一起的,其作用范围要比page作用域大。
2.request作用域可以通过调用request对象的setAttribute()和getAttribute()方法进行访问。
3.request作用域在页面转发或包含中同样有效,即在调用RequestDispatcher的forward()方法转向
的页面或者调用include()方法包含的页面,都可以共享request作用域
4.需要注意,request作用域对于每次客户端的请求都是不同的,对于任何一个新的请求,都会重新
创建于本次请求相对应的request作用域,而当请求结束后,与之相关的request作用域也随之失效。
5.注:RequestDispatcher对象的include()方法与pageContext对象的include()方法实现相同的效果。
3.session 作用域
1.只要将数据绑定到session作用域中,则该数据可以被本次会话中的其他页面所访问
2.session作用域可以通过session对象的setAttribute()与getAttribute()方法进行访问
4.application 作用域
1.application 作用域针对整个web应用,被该应用所有用户所共享
2.application 作用域可以通过application 对象的setAttribute()与getAttribute()方法进行访问
1.作用
1.对特定对象的追踪,如访问者的访问次数、最后的访问时间,路径等。
2.统计网页浏览次数。
3.在cookie有效期内,记录用户登录信息。
4.实现各种个性化服务,如针对不同用户喜好以不同的风格展示不同的内容。
注:不建议在cookie中保存比较重要或敏感的内容,
2.在 JSP 中使用 cookie
1.创建cookie对象:Cookie cookie = new Cookie(String name,String value);
name:代表cookie的名称
value:表示该名称对应的值
2.写入cookie:response.addCookie(newCookie);
方法名称 | 说明 |
---|---|
void setMaxAge(int expiry) | 设置cookie的有效期,以秒为单位 |
void setValue(String) | 在cookie创建后,为cookie赋予新的值 |
String getName() | 获取cookie的名称 |
String getValue() | 获取cookie的值 |
int getMaxAge() | 获取cookie的有效时间,以秒为单位 |
3.读取cookie
JSP通过request对象的getCookies()方法读取
示例:Cookie[] cookie =request.getCookies();
4.setaMaxAge(int expiry)
1.若expiry参数是大于0的整数,表示cookie的有效存活时间
2.如果设置expiry参数等于0,表示从客户端删除该cookie
3.设置expiry参数为负数或者不设置,表示cookie会在当前窗口关闭后失效
1.session作用域是在服务器端保存用户信息,cookie是在客户端保存用户信息
2.session作用域保存的值是Object类型,cookie保存的值是String类型
3.session作用域随会话的结束而将其存储的数据销毁,cookie可以长期保存在客户端
4.cookie保存不重要的信息,session保存重要信息
1,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。
2.javax.servlet包中的类和接口是通用的不依赖协议的Servlet API,包括:
接口:Servlet,ServletRequest,ServletRespones,ServletConfig,ServletContext
抽象类:GenericServlet.
javax.servlet.http包中的类和接口是用于支持HTTP协议的Servlet API.
方法名称 | 功能描述 |
---|---|
public abstract void init(ServletConfig config) | 由Servlet容器调用,用于完成Servlet对象在处理客户端请求前的初始化工作 |
public abstract void service(ServletRequest req,ServletResponse res) | 用于Servlet容器调用,用于处理客户端的请求 |
public abstract void destroy() | 由Servlet容器调用,释放Servlet对象所使用的资源 |
public abstract ServletConfig getServletConfig() | 返回ServletConfig对象,该对象包含此Servlet的初始化和启动参数。返回的ServletConfig对象是传递给init()方法的对象 |
public abstract String getServletInfo() | 返回有关Servlet的信息,如作者、版本和版权。返回的字符串是纯文本,而不是任何种类的标记(如HTML、XML等) |
抽象类GenericServlet 实现了Servlet接口和ServletConfig接口,给出了除了service()方法外的其他方法的简单实现。
方法名称 | 功能描述 |
---|---|
public void init(ServletConfig config) | 对Servlet接口中 init(ServletConfig config)方法的实现,并将ServletConfig实例进行保存以备用。此方法还有一个无参的重载方法init(),可用于子类中重写,以实现用户订制的初始化工作。 |
public String getInitParameter(String) | 通过调用ServletConfig的getInitParameter(String name)方法获取web.xml中设置的以name命名的初始化参数值。 |
public ServletContext getServletContext() | 返回ServletContext对象的引用 |
通常只需要重写不带参数的init()方法,如果重写init(ServletConfig Config)方法,则应包含super.init(config)代码
方法名称 | 功能描述 |
---|---|
public void service(ServletRequest req,ServletResponse res) | GenericServlet类中 service ()方法实现,将请求分发给protected void service(HttpSerletRequest req,HttpServletResponseres)方法 |
protected void service(HttpServletRequest req,HttpServletRequest resp) | 接受HTTP请求,并将它们分发给此类中定义的doXxx()分发 |
protected void doXxx(HttpServletRequest req,HttpServletRequest resp) | 根据请求方式的不同分别定义的处理方法,如doGET(),doPost()方法 |
HttpServlet的service(HttpServletRequest req,HttpServletResponse res)方法相当于一个分发器,可以根据请求方法的类型,调用相应的doXxx()方法,所有在编写Servlet时只需要根据应用的需要,重写doGet()或者doPost()方法
方法名称 | 功能描述 |
---|---|
public String getInitParameter(String name) | 获取web.xml中设置的以name命名的初始化参数 |
public ServletContext getServletContext() | 返回Servlet的上下文对象引用 |
一个ServletContext 接口的实例表示一个Web应用的上下文,Servlet使用ServletContext 接口定义的
方法与它的Servlet 容器进行通信。JSP内置对象 application就是ServletContext的实例
方法名称 | 功能描述 |
---|---|
public void setAttribute(String name,Object object) | 设置名称为name的属性 |
public String getInitParameter(String name) | 获取系统范围的名称为name的初始化参数值,系统范围的初始化参数可以在部署描述符中使用< context-param>元素定义 |
public Object getAttribute(String name) | 获取名称为name的属性 |
public String getRealPath(String name) | 返回参数所代表目录的真是路径 |
public void log(String message) | 记录一般日志信息 |
1.ServletRequest 接口:
当客户请求时,由Servlet容器创建ServletRequest对象用于封装客户的请求信息,这个对象将被容器作为service()方法的参数之一传递给Servlet,Servlet能够利用ServletRequest对象获取客户端的请求数据
方法名称 | 功能描述 |
---|---|
public abstract Object getAttribute(String name) | 获取所有为name的属性值 |
public abstract void setAttribute(String name,Object object) | 在请求中保存名称为name的属性 |
public abstract void removeAttribute(String name) | 清除请求中名字为name的属性 |
public abstract String getCharacterEncoding() | 返回请求体所使用的字符编码 |
public abstract void setCharacterEncoding() | 设置请求体的字符编码 |
public abstract String getParameter(String name) | 返回指定请求参数的值 |
public abstract String[] getParameterValues(String name) | 返回指定请求参数的全部值 |
public abstract RequestDispatcher getRequestDispatcher(String path) | 返回指向指定路径的请求分发对象 |
2.HttpServletRequest 接口:
HttpServletRequest 位于javax.servlet.http包中,继承自ServletRequest接口
方法名称 | 功能描述 |
---|---|
public abstract String getContextPath | 返回请求URL中表示请求上下文的路径,上下文路径是请求URL的开始部分 |
public abstract Cookie[ ] getCookie | 返回客户端再次请求中发送所有的cookie对象 |
public abstract HttpSession getSession () | 返回和此次请求相关联的session,如果没有给客户端分配session,则创建一个新的session |
public abstract String getMethod() | 返回此次请求所使用的HTTP方法的名字,如GET,POST |
public abstract String getHeader(String name) | 获取指定的请求头信息 |
1.ServletResponse 接口 :
用于封装响应数据,并且同时将这两个对象一并作为参数传递给Servlet。Servlet利用ServletRequest对象获取客户端的请求数据,经过处理后由ServletResponse对象发送响应数据。
方法名称 | 功能描述 |
---|---|
public abstract PrintWrite getWrite() | 返回PrintWrite对象,用于向客户端发送文本 |
public abstract String getCharacterEncoding() | 返回在响应中发送的正文所使用的字符编码 |
public abstract void setCharacterEncoding() | 设置发送到客户端的响应的字符编码 |
public abstract void setContentType(String type) | 设置发送到客户端响应的内容类型,此时响应的状态属于尚未提交 |
2.HttpServletResponse 接口
用于对客户端的请求执行响应
方法名称 | 功能描述 |
---|---|
public abstract void addCookie(Cookie cookie) | 增加一个cookie到响应中,这个方法可多次调用,设置多个cookie |
public abstract void addHeader(String name,String value) | 将一个名称为name,值为value的响应报头添加到响应中 |
public abstract void sendRedirect(String location) | 发送一个临时的重定向响应到客户端,以便客户端访问新的URL |
public abstract void encodeURL(String url) | 使用session ID对用于重定向的URL进行编码 |
1.导入Servlet所需要的包
2.自定义的Servlet类继承自HttpServlet类
3.实现doGet()或者doPost()方法
1.编辑web.xml,添加对应Servlet类的配置,如图:
注:1.两个servlet-name需要对应
2.url-pattern:元素指定Servlet的URL
3.servlet-class:对应需要跳转的页面
4.< url-pattern >/xxx/*< /url-pattern >,路径匹配,如果没有精确匹配,对/xxx/路径的所有请求
将由Servlet进行处理.
5.< url-pattern > *.xxx< /url-pattern >如果没有精确匹配和路径匹配,则所有针对.xxx扩展
,名的请求将由该Servlet处理
1.action属性对应的是web.xml文件中< url-pattern >元素所定的URL
注:request.getContextPath()可以获取当前Web应用的上下文路径。对于经由浏览器请求的URL,使用应用上下文路径进行约束,可以避免使用相对路径时可能发生的路径解析错误。如:
location.href = “”+contextPath+"/util?opr=list"
response.setContentType("text/html; charset=utf-8");
1.加载和实例化:
Servlet不能独立运行,它必须被部署到Servlet容器中,由容器实例化和调用Servlet的方法,Servlet容器在Servlet的生命周期内管理Servlet。
2.初始化:
设置数据库连接参数,建立JDBC连接,或者是建立对其他资源的引用(对于每一个Servlet实例,init()方法只能被调用一次)
(调用init())
3.服务:
Servlet被初始化后,就处于能响应请求的就绪状态。当Servlet容器接受客户端请求时,调用Servlet的service()方法处理客户端请求,HTTPServlet的service()方法会根据GET或POST请求转调doGet或doPost方法。
(调用service())
4.销毁:
Servlet容器判断一个Servlet是否应当被释放时,容器就好调用Servlet的destroy()方法,该方法指明哪些系统资源可以被系统回收
(调用destroy())
1.什么是EL表达式:他是借鉴了JavaScript和XPath的表达式语言。EL表达式定义了一系列的隐含对象和操作符,使开发人员能够方便地访问页面的上下文,以及不同作用域内的对象,而无须再JSP页面嵌入Java代码,从而使开发人员及时不熟悉Java也能轻松地编写JSP程序
2.EL表达式的特点和使用范围:提供了访问和处理应用程序数据的功能,通常用于在某个作用域内取得属性值,或者做简单的运算和判断。
特点:1.自动类型转换2.使用简单
3.EL表达式的语法:${EL表达式}
1.点操作符:EL表达式通常由两部分组成:对象和属性,如 ${employee.computer}可以访问employee对象的computer
2.[ ]操作符:与点操作符一样可以访问对象的某个属性,如 ${employee[“computer”]}
1.当属性名包含了特殊字符如“.”或“-”等情况下,就不能使用点操作符来访问,只能用[]
2.“[]”操作符中可以使用变量实现动态访问,如 ${employee[propertyName]},propertyName是另一个变量,改变其值可以动态访问employee的不同属性
3.访问数组,如果有一个对象名为array的数组,那么可以根据索引值来访问其中的元素,如 ${array[0]}
empty是用于检测一个变量值是否为null或者为empty(如长度为0的字符串变量或者集合变量)。如
变量a不存在,则${empty a }返回结果为true
> ${pageContext.request.contextPath}
1.作用域访问对象:可以把变量存放在不同作用域中以满足不同范围的访问需求
对象名称 | 方法描述 |
---|---|
pageScope | 与页面作用域(page)中的属性相关联的Map类 |
requestScope | 与请求作用域(request)中的属性相关联的Map类 |
responseScope | 与会话作用域(response)中的属性相关联的Map类 |
applicationScope | 与应用程序作用域(application)中的属性相关联的Map类 |
注:若不指定范围查找即${employee},则会按照page》request》response》application的顺序依次查找employee
2.参数访问对象:是与页面输入参数有关的隐式对象
对象名称 | 说明 |
---|---|
param | 按照参数名称访问单一请求值的Map对象 |
paramValues | 按照参数名称访问数组请求值的Map对象 |
如:${param.userName}==request.getParameter(“userName”);
${paramValues.habits}==request.getParameterValues(“habits”);
3.JSP隐式对象:
它是JSP和EL的一个公共对象,通过pageContext可以访问其他八个内置对象(request,response等)
对象名称 | 说明 |
---|---|
pageContext | 提供对页面信息和JSP内置对象的访问,语法如${pageContext.request.contextPath} |
1.什么是JSTL:JSP标准标签库,包含了多种标签,如:通用标签,条件判断标签和迭代标签等
2.如何使用JSTL:(1)需要到JAR包
(2.)需在使用JSTL的JSP页面中使用taglib指令导入标签库描述符文件
<%@ taglib uri = “http://java.sun.com/jsp/jstl/core” prefix=“c” %>
用于在JSP页面内设置,显示和删除变量,他包含了三个标签,< c:set>,< c:out>和< c:remove>
1.< c:set>标签:用于设置作用域变量的值或者作用域变量的属性值:
(1.)将value值存储到范围为scope的变量variable中。
如:
var属性的值是设置变量名
value属性的值是赋予变量的值
scope属性对应的是变量的作用域,可选项有page,request,session和application
(2.)将value值设置到对象的属性中:
如:< c:set value=“value” target = “target” property =“property "
target属性是操作的JavaBean对象,可以使用EL表达式来表示。
property属性对应JavaBean对象的属性名
value属性对应JavaBean对属性的值
2.< c:out>标签:用于计算表达式结果输出显示,类似于JSP中的<%=%>
(1.)不指定默认值:
如: < c:out value=”${name}"> c:out>
value属性指需要输出的表达式的运算结果,可以通过EL表达式来获取
(2.)指定默认值:
如:
default属性是value属性的值为空时输出的默认值
(3):< c:out>标签还有一个escapeXml属性,表示是否转换特殊字符,用于指定使用< c:out>标签输出诸如<,>,"、"、&之类在HTML和XML中具有特殊意义的字符时是否应该进行转义。
escapeXml属性设置会true,则会自动进行转义处理,这也是默认值。
如:< p>$ {"< a href = ‘http://www.baidu,com’>百度< /a>"}< /p>==
< p>< c:out escapeXml = “false” value = “< a href = ‘http://www.baidu,com’>百度< /a>”>< /p>
3.< c: remove>标签:用于移出指定作用域内的指定变量
< c:remove var=“msg” scope=“scope”/>
var属性是指待移出的变量的名称。
scope 属性是指移出的变量所在的范围,可选项有page,request,session和application
如果没有指定,则默认page
JSTL的条件标签库包括< c:if>、< c:choose>、< c:when>和< c:otherwise>标签
1.< c:if>标签:用于实现Java语言中if语句的功能
< c:if test = “condition” var=“varName” scope=“scope”>
//主体内容
< /c:if>
(1.)test属性是判断条件,当condition(可以用EL表达式表示)的结果为true时,会执行主体内容,如果为false则不会执行
(2.)var属性定义变量,该变量存放判断的结果,该属性可以省略
(3.)scope属性值var 定义变量的存储范围,可选值有page,request,session和application,该选项可以省略
2、< c:choose>:< c:choose>、< c:when>和< c:otherwise>一起实现互斥条件的执行,类似于Java语言的if-else if-else语句:
< c:choose var=“varName” scope=“scope”>
< c:when test=“condition”>
主体内容
< /c:when>
< c:otherwise>
主体内容
< /c:otherwise>
< /c:choose>
(1.)< c:choose> 是作为< c:when>和< c:otherwise>的父标签使用的,除了空白字符外,
< c:choose>的标签体只能包含这两个标签
(2.)< c:when>标签必须有一个直接的父标签< c:choose>,而且必须在同一个父标签下的
< c:otherwise>标签出现之前。在同一个父标签< c:choose>中,可以有多个< c:when>标签
(3.)< c:otherwise>标签必须出现在有一个直接父标签< c:choose>,而且必须是< c:choose>标签的最后一个嵌套的标签。
(4.)在运行时,判断< c:when>标签的测试条件是否为true,第一个测试条件为true的< c:when>标签体被JSP容器执行。如果没有满足条件的< c:when>标签,那么< c:otherwise>的标签体将被执行
通过< c:forEach>对集合对象进行迭代操作,很大程度减化迭代操作
1.遍历集合对象的成员:
主体内容