主要内容介绍

数据共享与页面跳转

1. 为什么要有跳转:

Servlet需要跳转到其它Servlet中,因为我们需要职责分明,不同Servlet来完成不同的功能

Servlet跳转到JSP中,Servlet输出动态页面实现恶心,咱们需要使用JSP来做页面的显示

2. 为什么要共享:

http是无状态的,因为在不断的跳转过程中我们需要对数据进行共享。昨天咱们已经学习了一个数据共享Session了。

Web页面跳转和信息共享

.Servlet作用域对象

.动态网页:JSP

请求转发(forward)

需求:AServlet中没有做完的事情跳转到BServlet中继续执行

语法:req.getRequestDispatcher(String path).forward(ServletRequest req,ServletResponse resp);

getRequestDispatcher : 获得转发器

path : 跳转到哪里?

特点

  1. 转发过程中浏览器地址栏路径没变

  2. 只发了一个请求

  3. 共享同一个请求(同一个请求对象),在请求中共享数据;

  4. 响应由最后一个决定

  5. 只能够访问当前应用中的资源,不能够跨域跳转(老师我想跳转到源代码官网去看视频...)可以使用相对路径,不推荐

  6. 可以访问WEB-INF中的资源

  7. 从html页面跳转到Servlet需要先加上server.xml中的path(如果有),Servlet中的跳转是不需要加的!

  8. 疑问: 既然可以访问WEB-INF中的资源了,那怎么之前又说放在里安全呢?

a) 程序没有提供的路径就不能够访问;b) 在跳转之前可以做权限判断

URL重定向(redirect)

需求:AServlet中没有做完的事情跳转到BServlet中继续执行

语法:resp.sendRedirect(String path);

特点: 测试下面每个点请留意浏览器地址栏!!!

  1. 浏览器中地址会变,相当于访问了两次

注意: path中应该加上server.xml中的path的值,如果有的话

  1. 发送了两个请求

  2. 因为是不同的请求,所以不能够共享请求中的数据

  3. 最终的响应是由最后一个Servlet决定

  4. 可以跨域访问资源(尝试访问itsource.cn)

请求包含(include-不用)

需求:AServlet中没有做完的事情跳转到BServlet中继续执行

语法:req.getRequestDispatcher(String path).include(ServletRequest req,ServletResponse resp);

特点: 基本上和forward一样,只是把两次响应的结果都输出了

  1. 常见面试题:

    1. 请求转发forward和URL重定向的区别?

    回答方式:

    ① 分别解释各自的定义

    ② 罗列各自的特点(最好是表格对比)

    ③ 各自的使用场景(其实也是来源于特点)

    2. 两者如何选择?

    ①如果需要共享请求中的数据,只能用请求转发

    ②若要访问WEB-INF中的资源 ,只能用请求转发

    ③若要跨域访问,只能用URL重定向

    ④请求转发可能造成表单重复提交问题

    1. 数据共享与作用域对象

      作用域对象意义;web组件之间传递和共享 数据  

    2. 作用域经典案例(测试)

    @WebServlet("/scope/main")
    public class MainServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //request
            if(req.getAttribute("count")==null){
                req.setAttribute("count", 1);
            }else{
                req.setAttribute("count", ((Integer)(req.getAttribute("count"))+1));
            }
            //session
            HttpSession session = req.getSession();
            if(session.getAttribute("count")==null){
                session.setAttribute("count", 1);
            }else{
                session.setAttribute("count", ((Integer)(session.getAttribute("count"))+1));
            }
            //application
            ServletContext application = req.getServletContext();
            if(application.getAttribute("count")==null){
                application.setAttribute("count", 1);
            }else{
                application.setAttribute("count", ((Integer)(application.getAttribute("count"))+1));
            }
            req.getRequestDispatcher("result").forward(req, resp);
        }
    }
    • @WebServlet("/scope/result")
      public class ResultServlet extends HttpServlet {

      protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //request
              int count1 = (Integer)request.getAttribute("count");
              response.getWriter().println("request:"+count1);
              //session
              HttpSession session = request.getSession();
              int count2 = (Integer)session.getAttribute("count");
              response.getWriter().println("session:"+count2);
              //application
              ServletContext app = request.getServletContext();
              int count3 = (Integer)app.getAttribute("count");
              response.getWriter().println("application:"+count3);
          }

      }

      ServletContext对象

      1. 获得ServletContext对象的方式:

      super.getServletContext()

      this.getServletContext()

      getServletContext()

      都是一样的,提示我们这个方法是父类中的

      ServletContext中的常用方法

      String getContextPath():获取当前应用的上下文路径.

      就是 Tomcat/conf/server.xml中的path值

      String getRealPath(String path):获取某个资源的绝对路径.

      例如获得 : F:\workspace\servlet_jsp\webapp

      String getInitParameter(String paramName);全局初始化参数:

      先看传统的Servlet的初始化参数:

      因为配置在当前ServletContextDemo中,所以只能被ServletContextDemo使用,其他Servlet无法使用.

      而在开发中,多个Web组件(Servlet/Filter)可以拥有共同的初始化参数,此时只能配置N次,不利于维护.

      解决方案:使用全局的初始化参数,Web组件都可以共用,配置问web.xml文件中.

    • 面试题1:

      req.getParameter("")和req.getAttribute("")的区别?

      req.getParameter :用户传过来的

      req.getAttribute :从作用域里拿的(必需是放到作用域里的)

      面试题2:

      ServletConfig.getInitParameter

      application.getInitParameter  有什么区别

      ServletConfig.getInitParameter 只作为于一个Servlet

      application.getInitParameter 整个应用都可以拿到

      配置的不同

      JSP原理分析(第一个JSP页面) 一个jsp其实就是一个Servlet;

      动态网页:JSP

    • Java Server Pages:Java的服务网页(Java动态网页)
    • 从访问方式来看:

      html,   通过tomcat和直接访问效果是一样的

      jsp     如果直接放在浏览器中显示源码,通过tomcat获得是正常内容

      jsp运行在服务器中

      访问方式 :   http://localhost/xx/hellojsp/Hello.jsp

      JSP三大指令

      page指令:     设置当前JSP配置信息.

errorPage="/myerror.jsp" :如果当前页面出错,就跳转到对应的页面

isErrorPage="true" :这个页面是否是错误页面(当我们要在页面上直接使用exception的时候就可以加上它)

演示1: 局部错误页面跳转

演示2: 全局错误页面

在项目的web.xml中配置

include指令:  JSP包含其他文件.

:taglib指令:   引人标签库.

JSP九大内置对象和四大作用域对象

application

JSP语法

  1. 注释
    1. <!-- html注释-->    直接写html注释,会输出到页面上让用户看到
    2. <%-- jsp注释--%>   用户从页面上是看不到的

2.输出数据到页面   <%=hello%>

3. JSP中的Java脚本片段   <% 语句1;语句2;%>

4.定义类的成员<% String str; void testMethod(){}       %>

Servlet交互与JSP的更多相关文章

  1. Servlet转发到JSP页面的路径问题

    一.现象与概念 1. 问题 在Servlet转发到JSP页面时,此时浏览器地址栏上显示的是Servlet的路径,而若JSP页面的超链接还是相对于该JSP页面的地址且该Servlet和该JSP页面不在同 ...

  2. Servlet交互【重定向 与 请求分派】详解

    Servlet交互 在serlvet中,需要调用另外一个资源来对浏览器的请求进行响应,两种方式实现: 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用Req ...

  3. jsp、jQuery、servlet交互实现登录功能

    做一个web项目,往往需要有一个登录模块,验证用户名和密码之后跳转页面.为了实现更好的交互,往往需要用到 jQuery 等实现一些友好提示.比如用户名或者密码输入为空的时候提示不能为空:点击提交的时候 ...

  4. 一口气从CSS讲到Servlet再到JSP、Struts2,清蒸JavaWeb的前前后后。

    B/S系统就是Browser/Server,浏览器/服务器系统,即,客户在浏览器操作,而代码实现的具体处理以及数据库操作等,则由后台服务器来完成,男耕女织,相得甚欢.比如我们查询成绩,我们通过浏览器输 ...

  5. ajax和servlet交互,表单日历插件,表单验证,form.js

    我的index.jsp <body> <a>点我获取数据</a> <table border=1px> <tr> <td>ID& ...

  6. ajax和servlet交互

    网上有比较多的教程来将如何实现ajax与servlet的交互了,这里和这里的教程可以参考参考,在此处我只简单说明一下,并记录一下我这次遇到的问题. 整个思路是:写个js函数,在里面使用XHR(ajax ...

  7. servlet跳转jsp

    ackage com.monkey.servlet; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; im ...

  8. Servlet中获取JSP内置对象

    方便自己查询,嫌低级的勿喷.... 1.request 在servlet的doGet和doPost的参数中就有HttpServletRequest req参数,而JSP内置request对象就是Htt ...

  9. 控制所生成的servlet的结构: JSP page指令

    在JSP中,主要有3种类型的指令:page, include和taglib.page指令允许我们通过类的导入.servlet超类的定制.内容类型的设置.以及诸如此类的事物来控制servlet的结构.p ...

随机推荐

  1. 跳石头|河中跳房子|NOIP2015提高组T4|二分法

    喵 提交地址:http://codevs.cn/problem/4768/ 题目: 题意:自己看 思路: 1.读入各个石头数据 2.直接二分答案: 枚举一个石头i和一个石头j,要求i和j之间的距离为m ...

  2. Codeforces 670E - Correct Bracket Sequence Editor - [线段树]

    题目链接:https://codeforces.com/contest/670/problem/E 题意: 给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号). 有如下操作: 1.往 ...

  3. [No000018F]Vim自动缩进配置、原理和tab键替换空格-Vim使用技巧(4)

    一.Vim缩进介绍 在没有设置Vim自动缩进的条件下,可以手动使用Vim命令对特定行进行缩进处理.在Vim插入模式下,按下 Tab 键时默认会输入一个制表符,可通过Vim配置项将 Tab 替换为空格, ...

  4. 1.7Oob成员变量和局部变量疑难区分

    import java.util.Scanner; public class booleann { private float fWidth; private float fHeight; void ...

  5. haproxy实现会话保持

    HAProxy系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.反向代理为什么需要设置cookie 任何一个七层的http负载均衡器,都 ...

  6. ASP.NET MVC 母版页

    为什么使用母版页?为了整个站点样式统一,任何WEB应用程序都应该使用母版页.MVC框架中,有新的方式为母版页传递数据.       一个WEB应用程序可以包含多个母版页,母版页用于定义页面布局,它与普 ...

  7. [daily] 使用左右对比查看diff 格式的文件

    如题: Given your references to Vim in the question, I'm not sure if this is the answer you want :) but ...

  8. [development][C] linux 设置线程名称

    两个API, 都是linux的. 不是POSIX, 是GNU?  傻傻搞不清楚. 1. pthread_setname_np / pthread_setname_np 2. ptctl 带 PR_GE ...

  9. [development][dpdk] dpdk与CONFIG_RTE_MAX_MEMSEG有关的错误

    dpdk程序无法启动, 错误如下: EAL: Requesting pages of size 2MB EAL: Requesting pages of size 2MB EAL: Can only ...

  10. Oracle 分区表 收集统计信息 参数granularity

    GRANULARITY Determines the granularity of statistics to collect. This value is only relevant for par ...