一、请求转发:forward.
- 常用API: 在HttpServletRequest对象中:
RequestDispatcher getRequestDispatcher(String path):获取请求分发器.
path: 请求转发到的目标资源
void forward(ServletRequest request, ServletResponse response) :请求转发的动作.
不要忘记forward!!!
1.请求转发的特点:
- 1.地址栏不会发生变化.还是s1.
- 2.只会有目标资源s2的响应,s1的响应不生效(不要在s1组价中写响应的操作,无效).
- 3.请求转发只会发出一次请求.可以在请求转发中,在多个组件中进行请求相关信息的数据共享.
能共享当前请求中的数据 - 4.请求转发可以访问WEB-INF中的资源,访问WEB-INF也只能使用请求转发.
- 5.请求转发不可以访问别人(域外)的资源.
-
- 相对路径:相对于当前资源所在的路径找对应的资源 如:a在/forward/路径下 直接找名称为b的资源是直接在/forward/下找
- 绝对路径:从根路径开始找对应的资源 如:a在/forward/路径下 使用/forward/b找资源,此时和a的路径无关
-
2.示例:
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求和响应的编码,设置了响应的MIME类型
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html ; charset=UTF-8");
// 获取一个请求参数username
String username = req.getParameter("username");
System.out.println("begin... a");
System.out.println(username);
// 获取到请求分发器,请求转发,跳转到BServlet 去完成剩下的工作,后面不执行
req.getRequestDispatcher("/forward/b").forward(req, resp);
// 请求转发可以进入WEB-INF下的资源
//req.getRequestDispatcher("/WEB-INF/hello.jsp").forward(req, resp);;
System.out.println("end... a");
// 给浏览器响应
PrintWriter out = resp.getWriter();
out.println("end a,username="+username);
}
二、重定向:redirect.
常用API: 在HttpServletResponse对象中
void sendRedirect(java.lang.String location) : 重定向,
location: 重新定位的资源的地址.
1.重定向的特点:
- 1.地址栏会发生变化.是s2.
- 2.只会有目标资源s2的响应,s1的响应不生效.
- 3.重定向会发送两次请求.在多个组件不能共享请求数据.
- 4.重定向,不能访问WEB-INF中的资源,相当于是把目标资源放在浏览器的地址栏敲回车.
- 5.重定向可以访问别人(域外)的资源.
三、 请求转发和重定向的选用
- 1.如果想在一次请求的多个组件之间可以共享数据,使用请求转发.
- 2.如果想请求到WEB-INF中的资源,使用请求转发.
- 3.如果想要访问到域外的资源,使用重定向.
其他的,可以使用请求转发和重定向的,都使用重定向. 通常选中重定向
四、 三大作用域对象
1.作用域对象
作用域 | 类型 | 描述以及对象的创建 |
---|---|---|
request | HttpServletRequest | 在一次请求过程中可以共享数据 |
session | HttpSession | 在一次会话过程中,不同的多个请求都可以共享数据. |
application | HttpSession | 在服务器启动过程中,都可以共享的数据.关闭服务器,application消失.(创建到销毁都只有一个ServletContext对象) |
2.共享数据的基本操作
1.新增数据(保存到共享作用域对象中,需要有属性名和属性值)
void setAttribute(java.lang.String name, java.lang.Object o): 保存数据,包含唯一的名字,和可重复值.
2.删除数据
void removeAttribute(java.lang.String name):根据共享属性名.来删除共享数据
3.修改数据
void setAttribute(java.lang.String name, java.lang.Object o)
4.查询数据
java.lang.Object getAttribute(java.lang.String name):通过共享数据(属性)的唯一名字,找到对应的值.
五、 EL表达式
EL表达式:可以简化JSP获取共享作用域对象中的数据.
1.目的:
就是从作用域对象中获取数据.从page作用域开始,一直找到,直到找到为止,如果找到,直接返回,如果没找到,返回的是空字符串.
2.语法格式:
${共享数据的属性名.属性名.属性名} request.setAttribute(“共享数据的属性名”,new Employee())
${属性名[“属性名”]}------->属性名不规范的时候使用 如:包含. - +
3.EL 表达式获取JavaBean
使用. 的方式: ${对象.属性} 推荐使用
使用getter 的方式 : ${对象.getter}
使用[] 的方式: ${对象[“属性名”]}
推荐使用点的方式,主要,属性命名不能带点等特殊符号
4.示例:
EL 表达式: ${applicationScope.student} ---> <br/>
<!-- tomcat7以上支持getName() -->
<br/>name: ${student.name} --- - ${student.getName()}---${student["name"]}
<br/>age: ${student.age}
<br/>hobby: [爱好2:${student.hobby[1]}]
<br/>list: ${student.list[0]}
<br/>map: ${student.map}
<br/>map.host: ${student.map.host}
<br/>map.wolfcode.cn: ${student.map["wolfcode.cn"]}
5.EL其他细节
-
使用pageContext内置对象来获取上下文路径:
pageContext内置对象
-
-
2.其他内置对象:
其他内置对象
指定在session作用域对象中获取数据 -
3.EL表达式支持运算:
${1+1 /2} <br/>
${1 eq 1} <br/>
<%
List<String> list = new ArrayList<String>();
list.add("a");
request.setAttribute("list",list);
%>
<!-- 判断集合是否为空 -->
${empty list}
六、 JSTL标签库
1.解决什么:
在JSP中写了java代码.使用JSTL消除JSP中的java代码,并优雅的完成数据的显示
- 常见的标签库:
核心标签库
格式化标签库
2.引入方式
JSTL的jar包3.增加指令
<%@ taglib %>
语法:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
注意:prefix属性的c 为该标签库起的一个别名,代表uri
4.条件判断
<c:if test="${num>5}">num 大于5</c:if>
<c:if test="${num<5}">num 小于5</c:if>
<c:if test="${num eq 5}">num 等于5</c:if>
<hr>
<c:choose>
<c:when test="${num>5}">num 大于5</c:when>
<c:when test="${num<5}">num 小于5</c:when>
<c:when test="${num eq 5}">num 等于5</c:when>
</c:choose>
5.循环标签
<c:forEach var="num" begin="0" end="20" step="1">
${num}
</c:forEach>
<hr/>
<!-- 遍历集合 -->
<c:forEach var="student" items="${list}">
${student.name} -> ${student.age}<br/>
</c:forEach>
6.时间格式化标签
<!-- jstl时间标签库 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%
request.setAttribute("date",new java.util.Date());
%>
<fmt:formatDate value="${date}" pattern="yyyy/MM/dd"/>
网友评论