美文网首页
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技术

    一、JSP的访问原理: 1.jsp的概念: JSP 全名为 Java Server Pages,中文名叫 java...

  • 一、JSP 入门

    JAVAEE 13 种计算规范之一,JSP (Java Server Page) 是一种模板技术。 JSP有如下特...

  • 人事管理系统(学习笔记)

    该系统使用了MyBatis + Spring + JQuery + JSP技术。采用了严格的JAVAEE应用结构,...

  • JavaWeb入门_模仿天猫整站Tmall_JavaEE实践项目

    Tmall_JavaEE 技术栈 Servlet + Jsp + Tomcat , 是Java Web入门非常好的...

  • Tomcat安装及IDEA配置

    Tomcat 中小型JavaEE服务器,仅支持少量的JavaEE规范servlet/jsp 下载 http://t...

  • JSP基础

    2019-05-14 基本知识 什么是JSP JSP是Java Server Pages的缩写,是符合JavaEE...

  • JSP学习笔记

    JSP(Java Server Page)和Servlet是JavaEE的两个基本成员,二者本质相同,JSP最终也...

  • JavaEE——JSP标签

    声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互...

  • JavaEE——jsp介绍

    声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互...

  • JAVAEE——动态页面技术JSP EL JSTL

    JSP技术 jsp脚本和注释 jsp脚本: <%java代码%> ----- 内部的java代码翻译到servic...

网友评论

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

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