jsp
servlet只负责响应请求产生的数据,并把数据通过转发技术带给jsp,数据显示jsp来做
jsp原理:jsp是一种Servlet,但是与HttpServlet的工作方式不一样。HttpServlet先由源代码编译为class文件部署到服务器下,先编译后部署。jsp先部署代码后编译为class文件的,先部署后编译。jsp会在客户端第一次请求jsp文件时被编译为HttpJspPage类(接口Servlet的一个子类)。该类会被服务器临时放在服务器工作目录里面。
jsp原理:jsp也是Servlet,运行时只会有一个实例。根Servlet一样,jsp实例初始化,销毁时也会调用Servlet的init()与destroy()方法。她也有自己的初始化和销毁_jspInit(),_jspDestoy().
jsp编译原理:客户端第一次请求a.jsp时,在tomcat先将a.jsp转化为标准的java源代码a_jsp.java,放在tomcat/work/Catalina/localhost/jsp/org/apache/jsp目录下,并将a_jsp.java编译为类文件a_jsp.class,该class文件便是jsp对应的Servlet。编译完后在运行class文件响应客户端请求,以后客户端再次访问a.jsp,服务器将不再重新编译jsp文件。而是直接调用a_jsp.class来响应客户端请求。
jsp是在客户端第一次请求的时候被编译。
jsp语法:
jsp脚本:<%java代码块%>
jsp输出:<%=各种数据类型(int,double,boolean,String,Object)%> 输出变量的后面不能有分号,输出某个类对象的时调用该对象的toString()方法。
jsp注释:<%-- --%>------JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。 (查看网页源码,没有显示 <!--这种是html注释,查看网页源码会有显示,一般不会用这种注释,会造成浏览器的流量增加-->)
jsp声明方法和全局变量:<%! %>
JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:
<%!
java代码
%>
所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。
多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。
JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。
jsp的if语句:if语句块前后必须使用{},if语句块可以有html代码
jsp的for循环,while。
jsp的return语句可以终止程序不再继续执行。
jsp的break语句改变程序的执行流程。
在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。
举例:
<%
int x = 10;
out.println(x);
%>
<p>这是JSP页面文本</p>
<%
int y = 20;
out.println(x);
out.println(y);
%>
多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<% %>之中的情况。如:out.println(x);
单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例如:
<%
for (int i=1; i<5; i++)
{
%>
<H1>www.it315.org</H1>
<%
}
%>
jsp指令:<%@ 指令 属性名="值" %>
常见指令:page,taglib,include
page指令:声明jsp页面的属性,多个指令可以写在一个page指令里面,也可以写在多个指令里。page的属性只能出现一次,除import属性外。
page指令是针对当前页面的指令,常用的page指令有8个:
1.<%@page language="java"%>设置jsp中用到的语言,用到的是java
2.<%@page extends="mypackage.myclass"%>设置目前jsp要继承的父类,一般不需要设置,在默认情况下,jsp页面默认的父类是HttpJspBase。
3.<%@page import="java.sql.*"% > jsp页面所用到的类
4.<%@page errorPage="error.jsp"%> 设置该jsp页面出现异常时所要转到的页面,如果没设定,容器将使用当前的页面显示错误信息
5.<%@page isErrorPage="true"%> 设置该jsp页面是否作为错误显示页面,默认是false,如果设置为true,容器则会在当前页面生成一个exception对象,和4拍配使用
6.<%@page contentType="text/html;charset=gb2312"%> 设置页面文件格式和编码方式
7.<%@page isThreadSafe="true"% > 设置容器以多线程还是单线程运行该jsp页面,默认是true,是多线程。设置为false,则以单线程的方式运行该jsp页面
8.<%@page session="true"% > 设置该jsp页面是否可以用到session对象(jsp内置对象,为web容器创建),默认是true,能用到session.设置为false,则用不到
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
使用page指令解决JSP中文乱码:
JSP程序存在有与Servlet程序完全相同的中文乱码问题
输出响应正文时出现的中文乱码问题
读取浏览器传递的参数信息时出现的中文乱码问题
JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题
JSP引擎将JSP源文件翻译成的Servlet源文件默认采用UTF-8编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。
如果JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。
如何解决JSP引擎翻译JSP页面时的中文乱码问题
通过page指令的contentType属性说明JSP源文件的字符集编码
page指令的pageEncoding属性说明JSP源文件的字符集编码
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
include指令:<%@ include file="URL"%> //实现jsp页面的区块化。先包含后编译成class文件
<jsp:include file="url"/>单独执行包含的文件,然后把执行的结果包含到当前的jsp页面中。先运行后包含。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
include指令:
include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:
<%@ include file="relativeURL"%>
其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
注意:由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
动态包含:<% request.getRequestDispatcher("relativeURL").include(request,response)%>
静态包含:<%@ include file="relativeURL"%> --s是编译时包含,它包含的所以jsp会编译成一个servlet
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
taglib指令:用来指明jsp页面内使用的jsp标签库。两个属性:uri为类库的地址,prefix为标签的前缀。
每个JSP 在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
jsp行为:是jsp内置的标签
<jsp:include />行为:运行时包含某个文件。若包含的为jsp文件,则先执行jsp文件,再把执行的结果包含进来。<jsp:include page="相对URL(必须为web应用程序内的文件)" flush=“true”/>。使用request.getRequestDispatcher("相对URL").forward(request,response)来执行包含文件。
使用Java Bean(POJO):JavaBean行为--useBean,setProperty,getProperty行为。
useBean:用于在JSP中定义一个javabean对象。
<jsp:useBean id="合法的java变量名称" class="javaBean类全名" scope="page-当前jsp内有效,request-当前的request中有效,session-对当前用户有效,application-当前web应用程序内有效。默认为page">
<jsp:setProperty name="javaBean类全名" property="javabean属性" value="属性值"/>
<jsp:getProperty name="javaBean类全名" property="javabean属性" value="属性值"/>
<jsp:plugin>:在浏览器中播放或显示一个对象(通常为Applet 或Bean)。
<jsp:params>:传送参数给Applet 或Bean
<jsp:fallback>:当不能启动Applet 或Bean 时,那么浏览器会有一段错误信息。
<jsp:forward page="跳转路径">Servlet中能够通过request.getRequestDispatcher("").forward(request,response)跳转到另一个Servlet或者另一个文件。
<jsp:param name="" value="">
JSP常用标签:
<jsp:include>标签
<jsp:forward>标签
<jsp:param>标签
<jsp:include>:标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。
语法:
<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。
flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。
<jsp:include>标签是动态引入, <jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。
而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。
<jsp:forward>:
<jsp:forward>标签用于把请求转发给另外一个资源。
语法:
<jsp:forward page="relativeURL | <%=expression%>" />
page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
<jsp:param>:
当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。
语法1:
<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
语法2:
<jsp:forward page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:forward >
<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。
jsp隐藏对象:
1.out输出流对象
隐藏对象out是javax.servlet.jsp.JspWriter类的实例。服务器向客户端输出的字符类内容可以通过out对象输出。
clean(),flush(),println().....
out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
设置page指令的buffer属性关闭了out对象的缓存功能
out对象的缓冲区已满
整个JSP页面结束
2.request 请求对象
隐藏对象request是javax.servlet.ServletRequest类的实例。代表客户端的请求。request包含客户端的信息以及请求的信息,如请求哪个文件,附带的地址栏参数等。每次客户端请求都会产生一个request实例。
setAttribute(),getAttribute(),getMethod(),getParameter(),getParameterNames(),getHeader().....
3.response 响应对象
隐藏对象response是javax.servlet.ServletResponse类的实例,代表服务器端的响应。服务器端的任何输出都是通过response对象发送到客户端浏览器。每次服务器端都会产生一个response实例。clear(),addCookie(),getOutputStream(),sendRedirect(),getOut(),setHeader()......
4.config 配置对象
隐藏对象config是javax.servlet.ServletConfig类的实例,ServletConfig封装了配置在web.xml中初始化JSP的参数。JSP中通过config获取这些参数。每个JSP文件都有一个config对象。
getInitParameter(),getInitParameterNames(),getServletContext(),getServletName()
5.session 会话对象
隐藏对象session是javax.servlet.http.HttpSession类的实例。session与cookie是记录客户访问信息的两种机制,session用于服务器端保存用户信息,cookie用于客户端保存用户信息。Servlet通过request.getSession()获取session对象,而在JSP中可以直接使用。如果JSP中配置了<%@ page session="false" %>,则隐藏对象session不可用。每个用户对应一个session对象。
getAttribute(),getAttributeNames(),setAttribute().....
6.application 应用程序对象
隐藏对象application是javax.servlet.ServletContext类的对象。application封装了JSP所在的Web应用程序的信息,例如web.xml中配置的全局的初始化信息。Servlet中application对象通过ServletConfig.getServletContext()来获取。整个Web应用程序对应一个application对象。
getAttribute(),getAttributeNames(),setAttribute(),removeAattrbute(),getInitParameter(),getInitParameterNames()...
7.page 页面对象
隐藏对象page为javax.servlet.jsp.HttpJspPage类的实例,page对象代表当前JSP页面,是当前JSP编译后的Servlet类的对象。page相当于普通java类中的关键字this。
8.pageContext 页面上下文对象
隐藏对象pageContext为javax.servlet.jsp.PageContext类的实例。pageContext对象代表当前JSP页面编译后的内容。通过pageContext能够获取到JSP中的资源。
findAttribute(),forward(),getOut(),getPage(),getResponse(),getRequest(),getSession().
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等
通过pageContext获得其他对象:
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
pageContext封装其它8大内置对象的意义,
pageContext作为域对象;
pageContext对象的方法
public void setAttribute(java.lang.String name,java.lang.Object value)
public java.lang.Object getAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name)
pageContext对象中还封装了访问其它域的方法
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public void removeAttribute(java.lang.String name,int scope)
代表各个域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute方法 (*重点,查找各个域中的属性) EL表达式
9.exception 异常对象
隐藏对象exception为java.lang.Exception类的对象。exception封装了JSP中抛出的异常信息。要使用exception对象,需要设置<%@ page isErrorPage="true" %>。隐藏对象exception通常被用来处理错误页面。
引入和跳转到其他资源:
PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和include方法。
方法接收的资源如果以“/”开头, “/”代表当前web应用。
映射JSP:
<servlet>
<servlet-name>SimpleJspServlet</servlet-name>
<jsp-file>/jsp/simple.jsp</jsp-file>
<load-on-startup>1</load-on-startup >
</servlet>
……
<servlet-mapping>
<servlet-name>SimpleJspServlet</servlet-name>
<url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>
如何查找JSP页面中的错误 :
JSP页面中的JSP语法格式有问题,导致其不能被翻译成Servlet源文件,JSP引擎将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息。
JSP页面中的JSP语法格式没有问题,但被翻译成的Servlet源文件中出现了Java语法问题,导致JSP页面翻译成的Servlet源文件不能通过编译,JSP引擎也将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息。
JSP页面翻译成的Servlet程序在运行时出现异常,这与普通Java程序的运行时错误完全一样,Java虚拟机将提示错误发生在Servlet源文件中的位置(行和列)以及相关信息。
pageContext(称之为page域)
request(称之为request域)
session(称之为session域)
servletContext(称之为application域)
请求都是交给servlet,servlet再转到index.jsp。首页都是一个servlet。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。