栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java从零到架构师第二季】【04】转发

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java从零到架构师第二季】【04】转发


持续学习&持续更新中…

学习态度:守破离


【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
    • 参考

Servlet + JSP处理请求的常见过程

转发(forward)

因为转发并不会响应浏览器,所以,转发后,浏览器地址栏中的url不会改变(浏览器是不知道发生了什么的),依然会是首次请求的url。又由于一次请求并没有结束,所以转发需要使用request进行操作。

转发只能在同一个项目(context)下进行,因此转发时使用相对路径即可,不能加context

转发是同一次完整的请求,一次请求就是一个request,一个request就像下图那样,当把绿色或橙色这个请求和响应流程结束后,它才会消逝。

一个request可以被转发多次,但是每次都会创建新的request。具体看下图:

EL表达式、JSTL标签库

EL表达式中的${obj.property},property指的是属性,而不是obj这个对象所对应类的某个成员变量

下载使用JSTL核心标签库

使用Servlet+JSP开发 目标:
  • 不拼接任何一句HTML,只写Java代码。(让Servlet只控制业务)

  • JSP中不编写一句Java代码,只写标签。

实现 UserListServlet.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
    



添加



    <%--
            items中的${argument}相当于
            通过request.getAttribute("argument")
            得到request的attribute中的对象

			${customer.name}相当于customer.getName()
    --%>
    
        
姓名 年龄 身高
${customer.name} ${customer.age} ${customer.tall}
重定向(redirect)

重定向要先给浏览器一次响应,因此要使用response操作。

重定向的path是交给浏览器去重新请求的。

重定向可以让浏览器重定向至http://host:port/context/...这种完整路径,也可以让其重定向至/context/...这种不完整路径(一个context就代表一个项目),如果给浏览器的是完整路径,那么浏览器就会直接请求该完整路径;如果给浏览器是不完整路径,那么浏览器默认会在该台服务器上去寻找该项目,也就是说,浏览器会在不完整路径之前拼接上http://host:post/

重定向的路径是由客户端发出的新的请求,凡是由客户端发出的新的请求(包括项目中jsp、html页面中的表单标签的action),当客户端发请求时,发现拿到的path是以/开头的,那么客户端只知道通过http://host:port/找到该台Tomcat服务器,并不会知道要访问服务器下的哪个项目,因此需要告诉浏览器context,向浏览器说明清楚需要访问哪一个项目。

转发与重定向

利用Servlet+JSP实现一个简单的客户关系管理系统

简述:首先访问用户列表页面,然后,用户可以点击添加,点击添加后跳转至添加用户界面,添加完成以后,点击保存,再次出现用户列表页面。

实现效果图


具体代码实现 Customer
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时,字段使用对象类型能够很好的表达值不存在这个概念。因此建议使用对象类型,不建议使用基本类型。

在Java后台开发中,编写JavaBean时推荐将基本数据类型写为包装类型。
    究其原因是因为:
        如果使用对象类型的话,当某field为null时(某字段不存在数据时)也可以直接使用该字段。
        而使用基本数据类型的话,则无法来表述某个字段为null的场景。
比如有个温度字段,该如何表示温度不存在的情况?
就算可以使用一些规范来约定,也会很麻烦,不如直接使用包装类型

DataManage
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}
adduser.jsp
<%@ 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技术基石.


本文完,感谢您的关注支持!


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/319306.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号