持续学习&持续更新中…
学习态度:守破离
【Java从零到架构师第二季】【04】转发_重定向
- Servlet + JSP处理请求的常见过程
- 转发(forward)
- EL表达式、JSTL标签库
- 下载使用JSTL核心标签库
- 使用Servlet+JSP开发
- 目标:
- 实现
- UserListServlet.java编写
- userlist.jsp编写
- 重定向(redirect)
- 转发与重定向
- 利用Servlet+JSP实现一个简单的客户关系管理系统
- 实现效果图
- 具体代码实现
- Customer
- 一些编写代码规范
- DataManage
- UserListServlet
- userlist.jsp
- adduser.jsp
- AddUserServlet
- 参考
因为转发并不会响应浏览器,所以,转发后,浏览器地址栏中的url不会改变(浏览器是不知道发生了什么的),依然会是首次请求的url。又由于一次请求并没有结束,所以转发需要使用request进行操作。
转发只能在同一个项目(context)下进行,因此转发时使用相对路径即可,不能加context
转发是同一次完整的请求,一次请求就是一个request,一个request就像下图那样,当把绿色或橙色这个请求和响应流程结束后,它才会消逝。
一个request可以被转发多次,但是每次都会创建新的request。具体看下图:
EL表达式、JSTL标签库EL表达式中的${obj.property},property指的是属性,而不是obj这个对象所对应类的某个成员变量
下载使用JSTL核心标签库 使用Servlet+JSP开发 目标:-
不拼接任何一句HTML,只写Java代码。(让Servlet只控制业务)
-
JSP中不编写一句Java代码,只写标签。
@WebServlet("/userlist")
public class UserListServlet extends HttpServlet {
private static final String JSP_USERLIST = "/pages/userlist.jsp";
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 如果需要从浏览器读取信息的话需要设置请求的字符集编码
// 设置字符集编码
// request.setCharacterEncoding("UTF-8");
// 响应的字符编码是没有必要设置的,因为Servlet只负责业务控制,和数据打交道,不负责展示
// response.setContentType("text/html;charset=UTF-8");
// 获取客户数据
List customers = getDataList();
// 将客户数据存储到request中
request.setAttribute("customers", customers);
// 转发到userlist.jsp页面进行数据展示
// 转发时,路径默认是从该项目的webapp下开始寻找的
request.getRequestDispatcher(JSP_USERLIST).forward(request, response);
}
private List getDataList() {
List list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(new Customer("张三" + i, 18 + i, (((i & 1) == 1)) ? 1.7f + i : 1.6f + i));
}
return list;
}
}
userlist.jsp编写
<%-- page指令下的contentType相当于response.setContentType --%>
<%-- 因为JSP的本质就是Servlet --%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%-- 因为是core库,所以prefix简写为c即可 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
user list
添加
| 姓名 | 年龄 | 身高 |
|---|---|---|
| ${customer.name} | ${customer.age} | ${customer.tall} |
重定向要先给浏览器一次响应,因此要使用response操作。
重定向的path是交给浏览器去重新请求的。
重定向可以让浏览器重定向至http://host:port/context/...这种完整路径,也可以让其重定向至/context/...这种不完整路径(一个context就代表一个项目),如果给浏览器的是完整路径,那么浏览器就会直接请求该完整路径;如果给浏览器是不完整路径,那么浏览器默认会在该台服务器上去寻找该项目,也就是说,浏览器会在不完整路径之前拼接上http://host:post/
转发与重定向 利用Servlet+JSP实现一个简单的客户关系管理系统重定向的路径是由客户端发出的新的请求,凡是由客户端发出的新的请求(包括项目中jsp、html页面中的表单标签的action),当客户端发请求时,发现拿到的path是以/开头的,那么客户端只知道通过http://host:port/找到该台Tomcat服务器,并不会知道要访问服务器下的哪个项目,因此需要告诉浏览器context,向浏览器说明清楚需要访问哪一个项目。
简述:首先访问用户列表页面,然后,用户可以点击添加,点击添加后跳转至添加用户界面,添加完成以后,点击保存,再次出现用户列表页面。
实现效果图
public class Customer {
private String name;
private Integer age;
private Float tall;
public Customer(String name, Integer age, Float tall) {
this.name = name;
this.age = age;
this.tall = tall;
}
public Customer() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Float getTall() {
return tall;
}
public void setTall(Float tall) {
this.tall = tall;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + ''' +
", age=" + age +
", tall=" + tall +
'}';
}
}
一些编写代码规范
- 编写JavaBean时,字段使用对象类型能够很好的表达值不存在这个概念。因此建议使用对象类型,不建议使用基本类型。
DataManage在Java后台开发中,编写JavaBean时推荐将基本数据类型写为包装类型。
究其原因是因为:
如果使用对象类型的话,当某field为null时(某字段不存在数据时)也可以直接使用该字段。
而使用基本数据类型的话,则无法来表述某个字段为null的场景。
比如有个温度字段,该如何表示温度不存在的情况?
就算可以使用一些规范来约定,也会很麻烦,不如直接使用包装类型
public final class DataManage {
private DataManage() {
}
private static final List list = new ArrayList<>();
static {
for (int i = 0; i < 10; i++) {
list.add(new Customer("张三" + i, 18 + i, (((i & 1) == 1)) ? 1.7f + i : 1.6f + i));
}
}
public static void addCustomer(String name, Integer age, Float tall) {
list.add(new Customer(name, age, tall));
}
public static List getCustomers() {
return list;
}
}
UserListServlet
@WebServlet("/userlist")
public class UserListServlet extends HttpServlet {
private static final String JSP_USERLIST = "pages/userlist.jsp";
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取数据
List customers = DataManage.getCustomers();
request.setAttribute("customers", customers);
// 请求转发时是由服务器操作的,知道是在哪个项目中,因此写相对路径即可
request.getRequestDispatcher(JSP_USERLIST).forward(request, response);
}
}
userlist.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
user list
添加
| 姓名 | 年龄 | 身高 |
|---|---|---|
| ${customer.name} | ${customer.age} | ${customer.tall} |
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
add user
AddUserServlet
@WebServlet("/adduser")
public class AddUserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
DataManage.getCustomers().add(new Customer(
request.getParameter("username"),
Integer.valueOf(request.getParameter("userage")),
Float.valueOf(request.getParameter("usertall"))
));
// 请求重定向是通知浏览器对某个路径进行重新请求,浏览器只知道在哪台服务器上,因此需要写上项目context
response.sendRedirect("/five_crms/userlist");
// 第二种方式实现重定向 不推荐使用
// response.setStatus(302); // 状态码
// response.setHeader("Location","/five_crms/userlist"); // 响应头Location
}
}
参考
李明杰: Java从0到架构师②JavaEE技术基石.
本文完,感谢您的关注支持!



