美文网首页
JavaEE学习day-50:JSP技术

JavaEE学习day-50:JSP技术

作者: 开源oo柒 | 来源:发表于2019-09-28 22:48 被阅读0次

    一、JSP的访问原理:

    1.jsp的概念:

    JSP 全名为 Java Server Pages,中文名叫 java 服务器页面,其根本是一个简化的 Servlet 设计,它是由 Sun Microsystems 公司倡导、许多公司参与一起建立的一种动态网页技术标准。

    2.特点:

    (1)本质上还是 Servlet;
    (2)跨平台,一次编写处处运行;
    (3)组件跨平台;
    (4)健壮性和安全性;

    3.第一个jsp页面:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'myjsp.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
    
      </head>
      
      <body>
      <h3>欢迎访问jsp页面</h3>
         <br>
      </body>
    </html>
    
    结果

    4.jsp的访问原理:

      浏览器发起请求,请求 JSP,请求被 Tomcat 服务器接收,执行JspServlet 将请求的 JSP 文件转义成为对应的 java 文件(也是Servlet),然后执行转义好的 java 文件。

    • 原理图:


      原理图
    • 注意:

    Jsp中可以书写java代码,但是java代码会被原样转译到其对应的java文件中执行。

    5.

    二、JSP的引入和请求转发:

    1.page指令的属性及作用:

    (1)Language:声明转译语言;
    (2)Import:声明转译时导入的包;
    (3)PageEncoding:设置jsp数据的保存编码格式;
    (4)ContentType:设置数据响应的格式;
    (5)Session:设置session的状态,默认为true,也就转译的servlet文件中默认session是开启,使用false关闭;
    (6)isErrorPage: 默认为false,true表示开启Exception异常对象使用;
    (7)errorPage:设置当jsp运行出现异常时跳转到指定页面。

    • 代码示例:
    <%@page language="java" %><%-- 声明转译语言 --%>
    <%@page import="java.util.*" %><%-- 声明转译时导入的包 --%>
    <%@page pageEncoding="utf-8" %><%--设置jsp数据的保存编码格式 --%>
    <%@page contentType="text/html; charset=utf-8"%><%--设置数据的响应编码格式 --%>
    <%@page session="false" %><%--设置session的状态,默认为true,也就转译的servlet文件中默认session是开启,使用false关闭 --%>
    <%@page isErrorPage="true" %><%--默认为false,true表示开启Exception异常对象使用 --%>
    <%@page errorPage="error.jsp" %><%--设置当jsp运行出现异常时跳转到指定页面 --%>
    <%--
        page指令的作用,设置jsp转译的时候的一些配置信息
     --%>
     <%
     // int i=5/0;
     %>
    

    2.jsp中的代码块:

    (1)局部代码块:<% %>;
    (2)全局代码块:<%! %>;
    (3)脚本段语句:<%= %>;

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%--
        局部代码块
        声明方式:<% java代码 %>
        特点:
            使用局部代码块声明的java代码会被原样转译到_jspService方法中。也就是局部代码。
     --%>
     <%
        int a=123;
        System.out.println(a);
        test();
     %>
    
    <%--
        全局代码块
            声明方式:<%! 声明全局java代码%>
            特点:
                全局代码块中声明的java代码,在被转译时,会转译成jsp对应的java文件的全局的代码。
            作用:
                声明方法和全局变量
            注意:
                使用全局代码块声明方法。使用局部代码块调用方法。
     --%>
     <%!
        int b=456;
        public void test(){
            System.out.println("全局代码块声明!");
        }
     %>
     
     <%--
        java脚本段、表达式 
        声明方式:<%=变量名或者方法名()%>
        作用:将java代码的运算结果数据或者其他数据响应给浏览器
        注意:
            在该表达式中不能使用分号结尾  
    --%>
     <i><%=a %></i>
     <b>jsp代码学习</b>
    

    3.jsp中的注释:

    (1)HTML注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
    (2)CSS注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
    (3)js注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
    (4)java注释:会被转译,但不会执行。
    (5)jsp注释:注释的内容不会被转译,也不会被执行。

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%--
        jsp的注释:
            HTML注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
            CSS注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
            js注释:会被转译也会被响应给浏览器,但是浏览器不会执行。
            java注释:会被转译,但不会执行
            jsp注释:注释内容不会被转译,也不会被执行
                格式:%-- 注释内容 --%
     --%>
     <html>
        <head>
        <style type="text/css">
            /*css注释*/
        </style>
        <script type="text/javascript">
            //js注释
        </script>
        </head>
        <%
            //java注释
            int b=456;
        %>
        
        <body>
            <!-- html注释 -->
            <b>HTML注释</b>
        </body>
     </html>
    

    4.jsp中的静态引入和动态引入:

    (1)静态引入:<%@include file=“要引入的资源的相对路径”%>;
    (2)动态引入:<jsp:include page=” 要引入的资源的相对路径”></jsp:include>;

    • 二者的区别:

    静态引入被引入的jsp文件被转译为一个java文件使用;动态引入被引入的文件会被单独转译,原有的jsp文件会调用被引入的jsp文件。

    • 代码示例:
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%--
        问题:
            发现,不同的jsp页面会使用相同的资源。如果将资源在每个jsp页面都单独声明
            则会造成代码的冗余量过高,不易于代码的维护和升级。
        解决:
            使用静态引入和动态引入的方式
        使用:
            静态引入:
                <%@include file="要引入的资源的相对路径"%>
                特点:
                    被引入的jsp文件和原有jsp文件被转译成一个java文件使用。
                    注意:静态引入的相关jsp文件中不能声明同名变量。
            动态引入:
                <jsp:include page="static.jsp"></jsp:include>
                特点:
                    被引入的文件会被单独转译,原有jsp文件会调用被引入的jsp文件。
                    注意:动态引入的相关jsp文件中可以声明同名变量。
        作用:
            实现了不同jsp之间的资源共享。        
     --%>
    <html>
        <head></head>
        <body>
            <h4>静态引入和动态引入的学习</h4>
            <hr>
            <%-- <i>&copy;网站声明,手机号:12434535,网站备案号等</i>--%>
                <%int a=3; %>
                <!-- 静态引入 -->
                <%-- <%@include file="static.jsp" %> --%>
                <!-- 动态引入 -->
                <jsp:include page="static.jsp"></jsp:include>
        </body>
    </html>
    
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <i>&copy;网站声明,手机号:12434535,网站备案号等</i>
    <% int b=2; %>
    
    结果

    5.jsp中的forward标签:

    解决不同的jsp在处理请求时,有可能会将当前的请求转发给另外的jsp进行处理的问题;实现jsp之间的请求转发。

    • 注意:

    forward标签中除了<jsp:param value="" name=""/>子标签以外不能出现其他内容,否则会报错。

    • 代码示例:
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%--
        jsp之间的资源转发:
            问题:
                不同的jsp在处理请求时,有可能会将当前的请求转发给另外的jsp进行处理。
            解决:
                使用forward动作指令
            使用:
                    <jsp:forward page="要转发的jsp的相对路径"></jsp:forward>
                特点:
                    从当前jsp跳转另外一个jsp页面。
                注意:
                    forward标签中除了<jsp:param value="" name=""/>子标签以外不能出现其他内容,否则会报错。
     --%>
    <html>
      <head>
      
      </head>
      
      <body>
       <h3>forward转发标签</h3>
       <hr >
       <%
       int a=2;
       if(a>3){
        %>
        <b>欢迎访问</b>
        <% 
       }else{
        %>
        <jsp:forward page="commen.jsp">
            <jsp:param value="zhangsan" name="uname"/>
        </jsp:forward>
        <%
       }
        %>
      </body>
    </html>
    
    
    • 跳转的页面
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <html>
      <head> </head>
      <body>
        <b>你的请求被屏蔽了,请及时续费</b>
      </body>
    </html>
    
    结果

    三、JSP的内置对象:

    1.九个内置对象:

    (1)request对象(HttpServletRequest):封装用户请求数据,通过该对象可以获取用户请求的相关数据。
    常用的方法:
    1)request.getParameter(String name)--->String: 根据参数的名称获取参数的值。
    2)request.getParameterValues(String name)--->String[]:根据参数的名称获取参数的值主要用于复选框。
    3)request.setAttribute(String name,Object value):将指定的值存到request范围中.
    4)request.getAttribute(String name):通过名称从request返回中获取值。
    5)request.getRequestDispatcher(String url).forward(request,response):请求转发
    6)request.setCharacterEncoding(String encoding):设置请求编码集,可以解决post提交的乱码问题。
    7)request.getSession():获取会话对象。
    需要了解的方法
    request.getScheme():获取协议 --->http
    request.getServerName():获取服务器名称或IP地址
    request.getServerPort():获取服务器端口号
    request.getContextPath():获取上下文路径(默认是项目名)
    (2)response对象(HttpServletResponse):封装响应数据。
    常用的方法:
    1)response.setContentType(String content);用法:response.setContentType("text/html;charset=utf-8");
    2)response.sendRedirect(String url):重定向
    3)response.getWriter()--->JspWriter:获取输出流进行输出
    (3)session对象(HttpSession):封装会话信息(浏览器和服务器之间的会话),一个会话中多次请求数据共享。
    常用的方法:
    1)session.setAttribute(String name,Object value):存值
    2)session.getAttribute(String name):取值
    3)session.invalidate():销毁会话
    (4)application对象(ServletContext):封装Servlet上下文信息,整个应用程序共享。
    常用的方法:
    1)application.setAttribute(String name,Object value):存值
    2)application.getAttribute(String name):取值
    (5)out对象(PrintWriter):在页面输出信息
    out.print(Object content)/out.println(Object content);
    out.write(Object content)

    (6)pageContext对象:页面上下文对象,可以通过该对象获取其他8个内置对象
    pageContext.setAttribute(String name,Object value):存值
    pageContext.getAttribute(String name):取值
    (7)page对象(this):当前页面
    (8)config对象(ServletConfig):封装配置信息
    (9)exception(Exception):封装异常信息

    2.jsp中四个作用域对象:

    (1)page:作用域范围仅限于当前页面。
    (2)request:作用域范围仅限于一次请求之间(包含当前页面)。注意:如果在A页面存值,在B页面取值,则A页面跳转B页面必须使用请求转发。
    (3)session:作用域范围仅限于一次会话之间(包含当前页面和多次用户请求)。
    (4)application:作用域范围是整个应用程序(项目)共享。
    (5)其范围大小:application>session>request>page;

    3.jsp和Servlet的职责:

    JSP 负责页面展现,Servlet 负责业务逻辑处理。

    四、JSP的相对路径和绝对路径:

    1.Servlet中请求转发和重定向的绝对路径:

    • 为什么写成绝对路径:

    写成绝对路径可以解决相对路径造成的文件路径发生变更后,从当前路径找不到资源的相对路径问题。

    • 代码示例:
    package com.zlw.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * Servlet重定向jsp
     *      response.sendRedirect("jsp的相对路径/servlet的别名");//重定向jsp页面
     *  Servlet请求转发jsp
     *      request.getRequestDispatcher("jsp的相对路径/servlet的别名").forward(req, resp);//请求转发到jsp页面
     *  服务器根目录    服务器的webapps目录路径             localhost:8080/
     *  项目根目录       服务器的webapps目录下项目路径    localhost:8080/jsp/
     * 注意:
     *  以上两种写法其实都是相对路径,相对路径指的是从当前请求路径查找jsp所经过的路径。
     * 请求转发和重定向的绝对路径写法总结:
     *  重定向:
     *      在重定向中的路径中第一个/表示服务器根目录。
     *      示例:
     *          response.sendRedirect("/虚拟项目名/资源路径");//重定向jsp页面
     *  请求转发:
     *      在请求转发中第一个/表示项目根目录
     *      示例:
     *          request.getRequestDispatcher("/资源路径").forward(req, resp);//请求转发到jsp页面
     * @author zhang
     *
     */
    public class MyServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设置请求编码格式
            request.setCharacterEncoding("utf-8");
            //设置响应编码格式
            response.setContentType("text/html;charset=utf-8");
            //获取请求信息
            String str = request.getParameter("chice");
            //处理请求信息
            if ("main".equals(str)) {
                //响应
    //          response.sendRedirect("user/main.jsp");//重定向
    //          request.getRequestDispatcher("user/main.jsp").forward(request, response);//请求转发
    //          response.sendRedirect("/jsp/user/main.jsp");//重定向,绝对路径
                request.getRequestDispatcher("/user/main.jsp").forward(request, response);//请求转发的绝对路径
                
            }
            //处理响应结果
        }
    }
    
    • 项目文件夹user下的main.jsp:
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'main.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    
      </head>
      
      <body>
        <h3>欢迎访问</h3>
        <hr>
      </body>
    </html>
    
    结果

    2.jsp中的绝对路径和basePath:

    • 问题:

    在jsp页面中进行资源之间的跳转时,如果书写的是相对路径,这样会造成如果当前文件的路径发生变更,从当前路径查找资源的相对路径都要重新进行书写。

    • 解决:

    将相对路径编写为绝对路径;
    示例:<a href="/虚拟项目名/资源路径">访问关键字</a>;

    • 注意:

    在Myeclipse中创建的jsp页面会自动生成路径处理代码basePath,而basePath的值为当前项目根目录,并且在head标签中使用了<base href="<%=basePath%>">,相当于将当前页面的资源全部默认定位为从项目根目录开始查找,我们就不需要写第一个“/”了。
    basePath方式和添加/方法只能二选一。
    “..”:表示返回上一级目录。

    • 代码示例:
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'path.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
        <%--
            问题:
                在jsp页面中进行资源之间的跳转时,如果书写的是相对路径
                这样会造成如果当前文件的路径发生变更,从当前路径查找资源的相对路径
                都要重新进行书写。
            解决:
                将相对路径编程绝对路径
            使用:
                在jsp中路径中的第一个/表示服务器根目录。
            示例:
                    <a href="/虚拟项目名/资源路径">访问关键字</a>
        
            注意:
                在Myeclipse中创建的jsp页面会自动生成路径处理代码basePath
                而basePath的值为当前项目根目录,并且在head标签中使用了<base href="<%=basePath%>">
                相当于将当前页面的资源全部默认定位为从项目根目录开始查找,我们就不需要写第一个/了
            注意:
                basePath方式和添加/方法只能二选一。
         --%>
    
      </head>
      
      <body>
        这是path.jsp
        <br>
        <a href="a/a.jsp">a.jsp</a>
      </body>
    </html>
    
    • WebRoot下a目录下的a.jsp:
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        
        <title>My JSP 'a.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    
      </head>
      
      <body>
        这是a.jsp
        <a href="b/b.jsp">b.jsp</a>
       <!-- 相对路径-->
       <!--<a href="../path.jsp">path.jsp</a>-->
      <!-- 绝对路径-->
      <a href="/jsp/path.jsp">path.jsp</a>
      </body>
    </html>
    
    • WebRoot下a目录下的b目录下b.jsp:
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        
        <title>My JSP 'b.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    
      </head>
      
      <body>
        这是b.jsp
       <!-- 相对路径-->
       <!-- <a href="../a.jsp">a.jsp</a>
        <a href="../../path.jsp">path.jsp</a>-->
        <!-- 绝对路径-->
        <a href="/jsp/a/a.jsp">a.jsp</a>
        <a href="/jsp/path.jsp">path.jsp</a>
      </body>
    </html>
    
    path.jsp a.jsp b.jsp

    相关文章

      网友评论

          本文标题:JavaEE学习day-50:JSP技术

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