5. JSP基础

5. JSP基础

5.1 简介

JSP全名为Java Server Pages,中文名叫java服务器页面,是一种动态页面技术,而HTML是属于静态页面。JSP可以在HTML中嵌入Java脚本代码,因为JSP本质上还是一个Servlet,因此JSP也必须依赖于web容器才能运行。JSP的出现并不是为了取代Servlet,而是简化了Servlet的工作,将Servlet中繁琐的视图呈现代码脱离出来,交给JSP来完成,让Servlet专注于请求的处理,所以在开发中通常将JSP和Servlet结合一起使用。

5.2 JSP引擎

由于JSP本质上就是一个Servlet,那么JSP引擎主要负责将JSP文件转义成一个Servlet的java源文件,然后再通过javac将这个源文件编译成class字节码文件并装载到JVM中执行。JSP引擎的核心类是JspServlet,位于Jasper.jar文件中,并且在Tomcat的web.xml中也默认就配置好了这个类(JspServlet也是一个Servlet)。因此,凡是以“.jsp”结尾的请求都会先经过JspServlet,那么这个引擎就可以开始工作。通常引擎转义和编译后的文件放在容器的work工作目录中。

注意:如果第一次访问JSP文件的时候,由于work目录中并不存在源文件和字节码文件,JSP引擎就必须完成这两个工作,因此,有可能在第一次访问JSP时会比较缓慢。当字节码编译出来加载后,第二次访问时速度就会很快了。

5.3 JSP的三大元素

5.3.1 指令元素

语法:<%@   %>

指令 说明
page指令 用于设置JSP页面的相关信息以及编码
include指令 用于静态包含其他的JSP页面代码,所谓静态包含,就是在编译期,将另外的JSP页面的代码合并到当前的JSP中,最终只会产生一个Java源文件
taglib指令 这个指令用于引入标签库

5.3.2 动作元素

语法:jsp:xxx

动作 说明
include 动态包含其他JSP页面的内容,所谓的动态包含是指在编译期将不同的JSP文件转义成不同的Java源文件,然后在运行时才将目标内容包含到当前的JSP页面中
forward 相当于Servlet中的转发,转发到其他的JSP页面或者Servlet
param 用于传递参数,通常结合其他的动作一起使用,例如转发时需要提交一些而外的参数
useBean 用于在JSP页面中使用JavaBean对象,通常结合setProperty和getProperty来使用,完成bean对象的赋值和取值操作

5.3.3 脚本元素

脚本元素主要就是在JSP中嵌入Java脚本代码,包括声明、表达式、Java脚本

声明语法:<%!  %>

表达式: <%= %>

Java脚本: <% %>

代码实例:


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   <%-- 声明变量和方法,这里声明的变量a是实例变量 --%>
   <%! 
        int a = 10;
        public void say(){
            System.out.println("hello");
        }
    %>
    
    <%-- 表达式,注意:表达式后面是不允许有;号结束的 --%>
    3 + 1 = <%=3+1%><br/>
    
    <%-- Java脚本,脚本代码最终会生成在servlet中的service方法中作为代码片段 --%>
    <table border="1">
        <tr>
           <th>Name</th>
           <th>Age</th>
        </tr>
        <% for(int i=0;i<5;i++){%>
          <tr>
            <td>user<%=i%></td>
            <td><%=10+i%></td>
          </tr>
        <%}%>
    </table>
</body>
</html>

5.4 JSP内置对象

内置对象,是在容器运行时将创建好的9个对象内嵌在JSP中,在JSP里可以直接拿来使用的对象。

对象 说明
out 字符流输出对象
config 等同于Servlet中的ServletConfig
page 表示当前JSP页面
request 等同于Servlet中的HttpServletRequest
response 等同于Servlet中的HttpServletResponse
session 等同于Servlet中的HttpSession
application 等同于Servlet中的ServletContext
pageContext 表示当前JSP页面的上下文对象
exception 表示当前JSP中的异常对象

示例代码:


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  <%-- 常用内置对象 --%>
  <%
     //使用request,API使用同HttpServletRequest一样
     request.getParameter("userName");
     request.setAttribute("user", "user1");
     request.getAttribute("user");
     
     //使用session,API使用等同于HttpSession
     session.setAttribute("user", "user2");
     session.getAttribute("user");
     session.getId();
     
     //使用response
     //response.sendRedirect("demo.jsp");
     
     //out对象,等同于字符输出流对象,在JSP页面输出相关内容
     out.println("hello world");
     //这个是输出在控制中
     System.out.println("hello");
     
     //使用application,等同于ServletContext
     application.setAttribute("userName", "user3");
     
     //pageContext使用
     //从pageContext中获取相关的其他对象
     HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
     HttpServletResponse res = (HttpServletResponse)pageContext.getResponse();
     HttpSession ses = pageContext.getSession();
     ServletConfig conf = pageContext.getServletConfig();
     ServletContext sc = pageContext.getServletContext();
     //也可以通过pageContext来统一设置不同的作用域
     //第三个参数表示要放入到哪个作用域,是一个int类型的参数
     //1代表page作用域(当前页面有效)
     //2代表请求作用域
     //3代表会话作用域
     //4代表上下文作用域
     pageContext.setAttribute("userName", "zhangsan", 2);
     //也可以指定中哪个作用域取出相应的值
     String name = (String)pageContext.getAttribute("userName", 2);
     out.println(name);
  %>
</body>
</html>


猜你喜欢

转载自blog.csdn.net/zhangguoqin66/article/details/81017917
今日推荐