Servlet之JSP

JSP本质

  • JSP是一种动态网页技术
  • 常见的几种动态网页技术:JSP(Java Server Page)、ASP(Active Server Page)、PHP(Hypertext Preprocessor)

本质:JSP就是Servlet,JSP也是Java类,通过JSP引擎将JSP转译成Servlet

JSP执行过程

Servlet之JSP_第1张图片
浏览器请求jsp,tomcat收到.jsp请求,则会到org.apache.jasper.servlet.JspServlet处理,JspServlet调用相应的java类,jsp引擎根据.jsp生成的java类(位于tomcat子目录work下面有_jsp.java,_jsp.class),执行*.jsp.class,将HTML数据输出给tomcat,tomcat再将这些数据输出给客户端。

JSP语法

1、page:设置jsp文件向Servlet转换时的公共参数

<%@ page contentType="text/html; charset=utf-8" language="java" pageEncoding="utf-8"%>
<%@ page import="java.util.*, java.lang.*" %> 
<%@ page session="false" %> 
<%@ page errorPage="error.jsp" %>
  • contentType:设置浏览器解析响应信息时使用的编码和解析格式
  • language:设置jsp要转译成的文件类型
  • import:导入需要的jar包,多个包用逗号分隔
  • pageEncoding:设置页面的编码格式
  • session:设置Servlet中是否有session对象
  • errorPage:当页面发生逻辑错误的时候,跳转的页面
  • extend:转译过去的Servlet类要继承的父类

2、局部代码块
可以将java代码与HTML标签写到一个jsp页面中,格式为<% %>,java代码转译成Servlet文件中,java代码与输出是保存在Servlet方法中的
缺点是代码可读性差,开发效率低,一般不用这种方式

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


<%
 int i = new Random().nextInt(10);
 if (i/2==0){
%>
    今天吃火锅
<%}else{%>
    今天吃烧烤
<%}%>

3、全局代码块
定义公共方法时需要使用全局代码块,格式为<%! %>,转译后生成的代码在Servlet类中,调用的时候需要使用局部代码块



    Title


<%--全局代码块写在<%! %>中--%>
<%!
 public String getStr(){
 return "全局代码块";
 }%>
<% System.out.println(getStr()); %>

4、脚本调用方式
格式为:<%= %>,使用这种调用方式,调用的方法必须有返回值,不能在变量或者方法后面加分号

<%!
 public String str = "全局代码块";
 public String getStr(){
 return str;
 }%>
<%=str%>
<%=getStr()%>

5、include

  • 静态导入
    <%@ include file="logo.jsp" %> file是相对路径
    在servlet引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起,全部放到_jspService方法中),所以只生成了一个servlet,所以两个页面不能有同名的变量。
    耦合性较高,不够灵活。
  • 动态导入

    在servlet引擎转译后,请求的此页面,所以共生成了两个servlet,所以可以有同名变量。
    生成两个servlet,相当于两个类之间的调用,耦合性较低,非常灵活。

6、forward请求转发

  • 用于请求转发!标签以后的代码,将不会被执行。
  • 标签中间可以使用增加转发参数,但是不能写其他任何字符,不然会报错

page.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


<%--请求的页面--%>
<%--转发到forward.jsp页面--%>

    
    


forward.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


<%--我是转发后的页面--%>
<%--获取转发过来的参数--%>
地区:<%=request.getParameter("location")%>

城市:<%=request.getParameter("city")%>

JSP九大内置对象

jsp页面在转译成对应Servlet文件时,会自动声明一些对象,在JSP页面中可以直接使用。可以在局部代码块和脚本段语句中使用,但是不能在全局代码块中使用。
九大内置对象:

  • pageContext 页面的上下文对象,封装了其他内置对象及当前页面运行的信息,每一个页面都有一个对应的pageContext对象,随着当前页面的结束而结束。
  • request 封装当前请求的数据,由tomcat创建,一次请求对应一个request对象
  • session 封装同一个用户不同请求的共享数据,一次会话对应一个session对象
  • application 相当于ServletContext对象,一个web项目只有一个对象,存储多有用户的共享数据,从服务器启动到服务器结束
  • response 响应对象,用来响应请求,讲处理结果返回给浏览器
  • page 代表当前jsp对象,与java中的this指针类似
  • exception 异常对象,存储当前运行异常信息,必须在page指令中添加属性isErrorPage="true"
  • config 相当于ServletConfig对象,用来获取web.xml中的配置数据,完成Servlet初始化
  • out 响应对象,jsp内部使用,带有缓存区的响应对象,效率高于Response

JSP作用域

四大作用域

  • pageContext 表示当前页面。解决当前页面内数据共享问题,获取其他内置对象
  • request 表示一次请求。一次请求的Servlet数据共享通过请求转发的方式,将数据流转到下一个Servlet
  • session 表示一次会话。一个用户发送的不同请求之间的数据共享,可以将数据从一个请求流转到其他请求
  • application 项目内不同的数据共享问题,将数据从一个用户流转到其他用户

JSP的路径

1、相对路径 相对于当前页面的路径。缺点:资源的位置不能随便修改,改了位置就访问不到了;如果目录结构比较深,路径写起来很麻烦。
page.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Page


<%--使用相对路径--%>
跳转到a.jsp

a.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    a


<%--使用相对路径--%>
返回到page.jsp 

2、绝对路径 在请求路径的前面加/,表示当前服务器的根路径,使用的时候添加 /虚拟项目名称/资源目录/文件名
page.jsp


<%--使用绝对路径--%>
跳转链接a

a.jsp


this is a.jsp
返回到page.jsp 

3、使用绝对路径需要手动添加虚拟项目名称,还是比较麻烦,可以使用全局路径声明

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
 String scheme = request.getScheme();
 String serverName = request.getServerName(); int serverPort = request.getServerPort();
 String contextPath = request.getContextPath(); String basePath = scheme+"://"+serverName+":"+serverPort+contextPath+"/";
 System.out.println(basePath);//http://localhost:8080/jsp/
%>


    <%--head头中添加base--%>
 
    Page


<%--直接写资源路径就可以了--%>
跳转到a.jsp

你可能感兴趣的:(java,servlet)