request作为域对象
使用servlet接受前端请求 响应数据,具体是 request 来接受请求的数据
response 来相应数据 但是 ,直接使用response 响应数据 是不够美观的
所以 后面咱们要引出一个 技术 叫做 jsp ,jsp 上面可以写html元素 ,所以 擅长页面展示
但是 有个问题 如何把后端动态的数据展示在 jsp 上面
这里 咱们现将第一种 解决方案 就是 域对象
他解决问题的思想 就是 在后端 把数据放在域对象中,在 jsp 页面上 从域对象中再取出来 *
javaweb 中 有四个域对象
- pageContext
- request
- session
- servletContext/application
一、四个域对象
域对象 | 作用范围 |
---|---|
pageContext | 该作用域中的属性只在当前 JSP 页面有效,跳转页面后失效。 |
request | 该作用域中的属性只在当前请求范围内有效,转发时可以共享request对象中数据,重定向后失效 |
session | 该作用域中的属性只在当前会话范围内有效。当session过期;或者没有设置JSESSIONID的有效期,而关闭网页,都会引起失效。 |
application | 该作用域中的属性在整个应用范围内有效,服务器重启后失效。 |
@WebServlet("/request5")
public class Request5Demo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String gender = req.getParameter("gender");
String age = req.getParameter("age");
String[] hobbies = req.getParameterValues("hobby");
String sheng = req.getParameter("sheng");
//封装到对象中
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setGender(gender);
user.setAge(Integer.parseInt(age));
user.setHobbies(hobbies);
user.setSheng(sheng);
//req 对象 作为 域对象来使用
//req.setAttribute("user",user);
//思考:为什么 重定向没有把数据带到这个页面
//resp.sendRedirect("/main.jsp");
// 转发 为什么 可以把数据带过去
//req.getRequestDispatcher("/main.jsp").forward(req,resp);
//由于 转发是一次请求 所以 request 在转发的时候 是生效的
// 重定向是两次请求 你在 servlet 中放数据的request 和 在jsp 中取数据的request 不是同一个
// 所以 重定向时 无法使用request 携带数据
//那么 可以使用作用域更大的域对象
HttpSession session = req.getSession();
session.setAttribute("user",user);
//重定向
resp.sendRedirect(req.getServletContext().getContextPath()+"/main.jsp");
//转发
// req.getRequestDispatcher("/main.jsp").forward(req,resp);
}
}
二、jstl标签
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。主要包括:
核心标签(c:)
JSTL函数(fn:)
格式化标签(fmt:)
数据库标签
XML标签
2.1核心标签库
标签 | 说明 |
---|---|
c:out | 将表达式的结果输出到页面中,类似于 <%= ...%> |
c:set | 在指定范围内设置变量或属性值 |
c:if | 类似于 Java if 语句,用于条件判断 |
c:choose | 类似于 Java switch 关键字,为 c:when和c:otherwise 的父标签 |
c:when | c:choose 的子标签,用来判断条件是否成立 |
c:otherwise | c:choose 的子标签,当所有的 c:when 标签判断为 false 时被执行 |
c:forEach | 类似于 Java for,用于迭代集合中的信息 |
2.2 使用步骤
1):有两种方案:
①:导入jstl-1.2.jar文件
②:写maven依赖(方便一些,个人推荐)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2)通过tablib指令在jsp中导入相关的标签库
<%@ page contentType="text/html;charset=UTF-8" language="java" %><!-- 引入核心标签库,前缀必须使用"c" --><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
3)核心标签库语法
<body>
<!-- 设置值
var 变量名
value 对应的值
-->
<c:set var="name" value="haha" ></c:set>
${name }
<!-- 输出值
default 表示默认值 -->
<c:out value="${name1 }" default="aa"></c:out>
<c:set var="sex" value="女"></c:set>
<!-- 单条件判断
类似java中 if(){}
test 判断条件,可以通过el表达式设置,在{}里面写判断逻辑
-->
<c:if test="${sex == '男' }">
<input type="radio" value="男" checked="checked" />男
<input type="radio" value="女" />女
</c:if>
<c:if test="${sex == '女' }">
<input type="radio" value="男" />男
<input type="radio" value="女" checked="checked" />女
</c:if>
<c:set value="50" var="score"></c:set>
<!-- 多条件判断 -->
<c:choose>
<c:when test="${score > 80 && score <= 100 }">
学霸
</c:when>
<c:when test="${score >= 60 && score <= 80 }">
中规中矩
</c:when>
<c:when test="${score > 0 && score < 60 }">
渣渣
</c:when>
<c:otherwise>
分数错误
</c:otherwise>
</c:choose>
<%
List<User> list = new ArrayList<User>();
for(int i = 0; i < 3; i++){
User d = new User();
d.setName("wangwu" + i);
d.setAge(20);
list.add(d);
}
request.setAttribute("userList", list);
%>
<!-- 循环遍历
items 要遍历的集合
var 遍历的元素的变量名
varStatus 变量的状态
count 序号 1, 2, 3, 4.。。
index 索引、下标
first 是否第一个元素
last 是否最后一个元素
-->
<table border="1" width="200">
<tr>
<td>name</td>
<td>age</td>
<td></td>
</tr>
<!-- var是循环时的存储数据的变量名,用它来得到想要的信息 -->
<c:forEach items="${userList }" var="user" varStatus="vs">
<tr>
<td>${user.name }</td>
<td>${user.age }</td>
<td>${vs.count }/${vs.index }/${vs.first }/${vs.last }</td>
</tr>
</c:forEach>
</table>
</body>
jsp中怎么实现动态路径?
${pageContext.request.contextPath} |
eg:
<a href="${pageContext.request.contextPath}/DogServlet">点击获得狗信息</a>