JavaEE学习day-50:JSP技术

一、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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • JSP总结(经典) day1 JSP 定义: 1)Java Server Page, Java EE 组件,本...
    java日记阅读 3,435评论 0 13
  • Jsp技术总结 1. 什么是JSP JSP即Java Server Pages,它和servlet技术一样...
    java日记阅读 1,652评论 0 18
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 940评论 0 0
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,404评论 0 10
  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,136评论 1 18