JAVA基础WEB阶段第 十三天——java注解开发+Reuqest域对象_请求转发_重定向+JSP+JSTL+EL表达式

一.Servlet3.0
    Servlet3.0支持异步,支持注解,支持插件.
    
    1.注解开发
    需求: 访问一个Servlet,在后台输出一句,Servlet的注解; 响应一句 你好!
    代码实现:
        @WebServlet(urlPatterns = "/Demo1_Servlet3" )
        public class Demo1_Servlet3 extends HttpServlet{
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
               doPost(req,resp);
            }

            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                //1.设置编码
                req.setCharacterEncoding("UTF-8");
                resp.setContentType("text/html;charset=utf-8");
                System.out.println("已 经接受到了请求");
                resp.getWriter().print("你好!");
            }
        }
    
    2.@WebServlet注解
        name() 代表的是servlet的名字  
        String[] urlPatterns() default {}; 请求的资源路径
        String[] value() default {};  他的作用和urlPatterns作用一样
            一般使用value不使用urlPatterns ; 如果有value 属性名称可以不写
            举例:@WebServlet(urlPatterns = "/Demo1_Servlet3" )
                 @WebServlet("/Demo1_Servlet3" )
        int loadOnStartup() default -1;     启动时机 2

二.Reuqest域对象_请求转发_重定向
    
    1.Request作为域对象
    setAttribute(String name, Object obj) void 向Request域中保存数据
    getAttribute(String name)Object 从Request域中获取数据
    removeAttribute(String name) void  从Request域中移除数据


    域对象: 作为一个容器对象,不同的域对象他们的使用范围不同.
    ServletContext 整个web项目中都有效
    session           整个会话中都有效
    request           一次请求中有效
    
    
    2.请求转发
      使用request对象调用一个调度器对象Dispatcher , 还调用一个forward(request,response)进行转发.
      整个过程只有一次请求.
      
        2.1转发案例: request域中设置内容转发后再新的Servlet获取request域对象中的值
        /**
         * 1.如何转发,API
                1)  RequestDispatcher getRequestDispatcher(String path)  调用一个调度器对象,传递的是将要跳转的地址;
                2) RequestDispatcher对象有一个forward(req,resp) 可以完成转发
                举例:
                RequestDispatcher dispatcher =  req.getRequestDispatcher("Servlet02");
                dispatcher.forward(req,resp);
                //把两句合并成一句:
                req.getRequestDispatcher("Servlet02").forward(req,resp);

         * 2.获取request域对象,给里面存放一个name为tom值
         *      request.setAttribute("name","tom")
         * 3.让页面转发哦到Demo2_ForwardServlet
         * 4.在Demo2_ForwardServlet, name取出来打印在控制台.
         */
        @WebServlet("/Demo_ForwardServlet")
        public class Demo_ForwardServlet extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                //1.设置编码
                request.setCharacterEncoding("UTF-8");
                response.setContentType("text/html;charset=utf-8");
                System.out.println("已经访问到了Demo_ForwardServlet,设置名字即将转发");
                //2.给request域对象设置内容
                request.setAttribute("name","tom");
                //3.转发到Demo2_ForwardServlet
                request.getRequestDispatcher("Demo2_ForwardServlet").forward(request,response);
            }

            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
              
        
        @WebServlet("/Demo2_ForwardServlet")
        public class Demo2_ForwardServlet extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                //1.设置编码
                request.setCharacterEncoding("UTF-8");
                response.setContentType("text/html;charset=utf-8");
                //2.获取request域中的数据
                String name = (String) request.getAttribute("name");
                System.out.println("这是Demo2_ForwardServlet获取到的name = "+name);
            }

            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
      
      
      
      重定向的案例: request域中设置内容重定向后再新的Servlet获取request域对象中的值
      @WebServlet("/Demo_Redirect")
        public class Demo_Redirect extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                //1.设置编码
                request.setCharacterEncoding("UTF-8");
                response.setContentType("text/html;charset=utf-8");
                System.out.println("已经访问到了Demo_Redirect,设置名字即将转发");
                //2.给request域对象设置内容
                request.setAttribute("name","tom");
                //3.重定向到Demo2_Redirect
                response.sendRedirect(this.getServletContext().getContextPath()+"/Demo2_Redirect");
            }

            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }

        
        @WebServlet("/Demo2_Redirect")
        public class Demo2_Redirect extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                //1.设置编码
                request.setCharacterEncoding("UTF-8");
                response.setContentType("text/html;charset=utf-8");
                //2.获取request域中的数据
                String name = (String) request.getAttribute("name");
                System.out.println("这是Demo2_Redirect获取到的name = "+name);
            }

            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
      
      
    
    3.服务器内部页面跳转(转发/重定向)
        区别:
        1.转发浏览器地址栏不变; 重定向浏览器地址栏改变;
        2.转发只有一次请求,一次响应; 重定向两次请求两次响应;
        3.转发只能转发到本项目内部,不能转发到外网; 重定向可以转发到外网;
        4.转发可以在request域中存数据,也可以获取到; 重定向的话,数据不能存在request域中
        5.转发使用request对象; 重定向使用的response对象
        6.转发的时候request.getRequestDispatcher("资源路径"),可以不加虚拟路径, 重定向resp.sendRedirect("虚拟路径/资源路径")
        
    
    

三.JSP
    1.概念
    JSP全名是Java Server Pages,
    它是建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码与Java代码共同存在.
    
    JSP的本质是一个Servlet!!
    
    2.入门案例
     web目录下新建一个demo1.jsp; 编写一个HTML代码;java代码
        
        <%--
            1.html 代码
            我的jsp的html代码
            2.java 代码
            <%
                java代码 ,定义一个java的日期输出控制台
            %>
        --%>

        我的jsp的html代码

        <%
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateStr = sdf.format(date);
            System.out.println(dateStr);
        %>
    
    3.jsp注释
        html注释  
            注释html代码; 源码中显示被注释的内容
        
        java注释  //   /**/   只能用在java代码中
            只能注释java代码
        
        jsp注释   <%--被注释的内容--%>
            即可注释html代码也可以注释java内容 (不会再源码中显示,也不会再编译后的文件显示)
    
    
    4.jsp中的脚本类型(三种)
        
        第一种: 编写下面的代码,会内容生成在一个成员方法中
         <%
            java代码
         %>
        
        第二种:编写下面的代码,内容会生成在成员位置(类中方法外,定义成员变量)
        <%!
            java代码
        %>
        
        第三种方式: 相当于一个输出语句,向浏览器输出
        <%=表达式%>
    
    
        代码举例:
        
            
            <%
                int i = 10;
                System.out.println(i);
            %>

            
            <%!
                int i = 20;
            %>


            
            <%=i%>
        


    5.jsp的执行原理
        1.jsp本质是一个Servlet
        2. demo2.jsp 请求的时候会被编译成demo2_jsp.java==> 被编译成.class ====>虚拟机加载.class文件执行
        
        3.内部执行的原理:
        demo2_jsp.java=== Demo2_jsp 类 继承HttpJspBase , 重写了_jspService方法 ===> HttpJspBase
        继承HttpServlet,重写了service; service方法中调用了_jspService (执行的是子类的方法)
    
    
    6.jsp的9大内置对象(面试题)
      内置对象: 在jsp中<% %> 可以直接使用的对象
      
      对象          类型
      request       HttpServletRequest
      response      HttpServletResponse
      config        ServletConfig
      session       HttpSession
      application   ServletContext
      out           JspWriter
      page          Object
      pageContext   PageContext
      exception     Throwable   (有一个开关,设置为错误页面才有该对象)
      
      


四.EL表达式
    1.概念
        EL(Express Lanuage)表达式可以嵌入在jsp页面内部,
        减少jsp脚本的编写,EL 出现的目的是要替代jsp页面中输出脚本的编写。
         <%=date%> 
        
    
    2.作用
        1. 从域对象中查找指定的数据
            (ServletContext[jsp:application]  Session   HttpServletRequest pageContext[jsp有servlet中没有])
            域对象:setAttribute(String key, Object value) ....
         2. 内置对象使用
        3. 执行运算符
        4. 动态获取配置文件中的数据(框架在说)

    
    3.EL表达式的使用
        3.1格式
            setAttribute(String key, Object value) 
            ${key}  根据key值获取value
        
    
        3.2 EL表达式作用一:从域中取出基本数据数据 
        需求:给域中存放String数据,通过EL表达式获取到.
        
        代码演示:
        
        
            Title
        
        
            <%
                //编写java代码,内置对象request.设置域中数据
                //通过el表达式获取到域中的值
                request.setAttribute("key","abc");
            %>
            



            <%=request.getAttribute("key")%>  

            ${key}
        
        

你可能感兴趣的:(JAVA基础WEB阶段第 十三天——java注解开发+Reuqest域对象_请求转发_重定向+JSP+JSTL+EL表达式)