JavaWeb 06 JSP

来源:互联网 发布:java集合框架容器 编辑:程序博客网 时间:2024/06/04 19:10

1、概念

Java Server Pages Java的服务页面

HTML页面可以很好的显示页面,但是它不能处理用户的请求
Servlet可以处理用户的请求,但是它不能很好的显示页面
所以将HTML和Servlet的优点结合起来,就是JSP
即 JSP = HTML + Servlet

2、特点

⑴ JSP页面必须运行在服务器上
⑵ JSP就是可以写Java代码的HTML
⑶ JSP的本质就是一个Servlet

3、运行原理

第一次访问JSP页面时

⑴ 首先JSP引擎将JSP页面翻译成一个 .java文件
⑵ 其次Java虚拟机将 .java文件编译成 .class文件
⑶ 最后JSP容器(服务器)根据类来创建Servlet对象,处理用户的请求,并给与用户响应

Tips:.java和 .class两个文件可以到

 eclipse工作空间\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\项目名\org\apache\jsp

文件夹下查看

再次访问JSP页面(在不改变该JSP页面的前提下)

JSP容器直接根据类来创建对象,并处理用户请求,给与用户响应

注意:一定是在不改变JSP页面的前提,否则JSP引擎会重新将JSP页面翻译成 .java文件,JVM编译成 .class文件,然后服务器再根据类创建对应的对象

具体示例

创建一个index.jsp页面

⑴ 首先JSP引擎将index.jsp翻译成index_jsp.java文件
该文件位于:

D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\项目名\org\apache\jsp

文件夹下

打开可以看到里面有一个

public void _jspService(HttpServletRequest request, HttpServletResponse response) {} 方法

该方法里面调用了out对象【JspWriter类型】,将我们在JSP页面上写的所有内容,通过out.write(“\r\n”); 方法一行一行地打印了出来

⑵ 然后JVM将index_jsp.java文件编译成index_jsp.class文件
该文件和index_jsp.java在同一路径下

Tips:可以看到index_jsp继承自HttpJspBase,而HttpJspBase又继承自HttpServlet。所以每一个JSP页面都是一个Servlet

⑶ JSP容器将根据index_jsp class,来创建对应的对象,接收用户的请求,并给与相应的响应

具体是因为在eclipse中配置的tomcat服务器,它的配置文件夹Servers,里面有一个类似于我们创建的动态WEB工程里的web.xml 配置文件,它也是这个名字
里面有一个Servlet的配置信息:

<servlet>  <servlet-name>jsp</servlet-name>  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class></servlet>

对应的有一个servlet-mapping:

<!-- The mappings for the JSP servlet --><servlet-mapping>    <servlet-name>jsp</servlet-name>    <url-pattern>*.jsp</url-pattern>    <url-pattern>*.jspx</url-pattern></servlet-mapping>

这个JspServlet继承自HttpServlet:
class JspServlet extends HttpServlet
这个类通过调用自身和其他类的一系列方法,创建JSP对应的Servlet对象

JSP的运行原理

4、基本语法

JSP模版元素

就是JSP页面中的HTML标签,在HTML页面中怎么使用,在JSP页面中还怎么使用

JSP脚本片段

格式:

   <%    // Java代码   %>

一个JSP页面中可以写多个JSP脚本片段,但要保证多个脚本片段拼接后的完整性

  <%      for(int i = 0; i < 10; i++){  %>        <h1>我是1级标题</h1>  <%      }  %>

打印10遍1级标题

JSP表达式

格式:

   <%=对象%>

将对象输出到浏览器中

注意:不可以写分号(;)

Tips:其底层就是调用了:out.print(Object obj);方法
可以看到JSP表达式的内容被当作实参传入了out.print() 方法中,所以不能加分号(;)

JSP的注释

<!-- HTML注释 -->

   <%      // Java注释   %>

 <%-- JSP注释 --%>

5、JSP指令标签

语法格式

  <%@ 指令名 属性名1="属性值1" 属性名2="属性值2" %>

page指令

用来告诉服务器如何解析当前JSP页面

language属性


指定当前JSP页面所使用的开发语言,默认值是java,也只有java可选

contentType

告诉浏览器用什么字符编码来解析当前JSP页面。即response.setContentType(String type); 方法

pageEncoding

设置当前页面所使用的字符集

errorPage

设置当当前JSP页面出错时,要转发的页面

例如:

errorPage="/error.jsp"

当当前页面出错时,跳转到WebContent目录下的error.jsp

isErrorPage

设置当前页面是否是一个错误页面,默认值为false。如果设置为true,则设置了当前页面为一个错误页面。这时就可以用exception对象来获取异常信息

注意:如果想在当前JSP页面中使用exception对象,就必须设置:isErrorPage=”true”

session

设置当前JSP页面中是否可以使用session对象,默认值为true,可以使用。一般不会更改

import

用来导java包。一般会创建一个新的page指令来导包
示例:

<%@ page import="java.util.Date"%>

导入util包下的Date

include指令

 <%@ include file=""%>

用来设置将某个页面中的内容添加到当前JSP页面中
file属性:要添加的页面的URL地址

注意:file属性对应的页面文件要存在,否则在添加的时候就会报错

Tips:这种包含方式叫静态包含。因为它是将要添加的页面的内容完全地粘贴到当前JSP页面中,不是动态地引用。同时被包含的页面不会在 eclipse工作空间.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\项目名\org\apache\jsp文件夹下生成 .java和.class文件

示例:

   <body>     <h1>我是JSP</h1>     <%@ include file="/other.jsp" %>   </body>

在当前JSP页面中,静态包含另外一个jsp页面内容

6、JSP动作标签

语法格式

   <jsp:标签名 属性名="属性值"></jsp:标签名>

特点:JSP动作标签由服务器解析,在解析的时候会将其转换为相应的Java代码

forward标签

<jsp:forward page=""></jsp:forward>

用来进行请求的转发。改转发没有请求参数
page属性:要转发到URL地址

注意:
没有请求参数的forward标签,不能换行,即开始标签和结束标签没有在同一行;也不能有空格,即开始标签和结束标签虽然在同一行内,但是中间却包含空格
否则在转发时会报错:Expecting “jsp:param” standard action with “name” and “value” attributes

   <jsp:forward page="">     <jsp:param value="" name="" />   </jsp:forward>

带请求参数的转发

Tips:可以通过request.getParameter(); 来获取转发时携带的请求参数

示例:
【发起带请求参数的转发的JSP页面】

    <body>      <jsp:forward page="/other.jsp">        <jsp:param value="tomcat" name="name" />      </jsp:forward>    </body>

【获取请求参数的JSP页面】

    <body>      <%=request.getParameter("name")%>    </body>

include标签

  <jsp:include page=""></jsp:include>

用来将某一指定的页面包含到当前JSP页面中。这种包含方式被称为动态包含

静态包含和动态包含的适用

一般情况下:
⑴ 如果被包含的页面是一个静态页面(HTML),则使用静态包含
⑵ 如果被包含的页面是一个动态页面(JSP),则使用动态包含

7、JSP中的九大隐含对象

概念

不用声明就可以直接使用的对象

九个隐含对象之所以可以在JSP页面中直接使用,是因为在对应的类中的_jspServer 方法中,已经声明了这些对象

JSP中的九个隐含对象

pageContext

类型:PageContext
作用:可以通过该对象获取其他8个对象。它是一个域对象

request

类型:HttpServletRequest
作用:处理用户的请求。和Servlet中的HttpServletRequest的作用一样。它是一个域对象

session

类型:HttpSession
作用:一个域对象

application

类型:ServletContext
作用:一个域对象

response

类型:HttpServletResponse
作用:给与用户响应。和Servlet中的HttpServletResponse的作用一样

config

类型:ServletConfig
作用:和Servlet中的ServletConfig的作用一样

out

类型:JspWriter
作用:和PrintWriter【response.getWriter();】的作用一样。例如给浏览器一个响应字符串

page

类型:Object
作用:等于this,代表当前JSP页面对象。没用

exception

类型:Throwable
作用:获取异常信息。前提是JSP页面中的page指令中的 isErrorPage=”true”

8、JSP中的四个域对象

概念

域即区域,范围。在JavaWeb中指不同的资源(JSP页面、Servlet)

由来:
由于不用的资源之间需要共享数据,所以就有了域对象
特点:
四个域对象中都各自维护着一个Map,用来存取要共享的数据

四个域对象都有的三个方法

setAttribute

public void setAttribute(String name, Object o);
向域对象中添加属性

getAttribute

public Object getAttribute(String name);
获取域对象中的属性

注意:不同的域对象,只能获取对应的域对象中的属性。例如request只能获取request中保存的属性;application只能获取application中保存的属性,但是application不能获取request中保存的属性

removeAttribute

public void removeAttribute(String name);
根据属性名将域对象中的属性值移除

pageContext域

pageContext
范围:当前页面

request域

request
范围:当前请求(一次请求

session域

session
范围:当前会话(一次会话

application域

application
范围:当前整个WEB应用

四个域对象的使用原则

四个域对象的作用范围从小到大:
pageContext < request < session < application

使用的原则就是:能用范围小的,就不用范围大的

9、Servlet和JSP的分工

Servlet用来处理用户的请求
JSP则用来显示页面

0 0