美文网首页Java Web
day13_7-WEB组件交互相关

day13_7-WEB组件交互相关

作者: 建国同学 | 来源:发表于2020-04-09 23:56 被阅读0次

    一、请求转发: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其他细节

      1. 使用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"/>
    

    相关文章

      网友评论

        本文标题:day13_7-WEB组件交互相关

        本文链接:https://www.haomeiwen.com/subject/gydkmhtx.html