一、 基本原理
1、 Tomcat自动将jsp文件转化成servlet。
2、 <!% %>中申明的变量和方法自动被转化为相应的servlet的成员变量和成员方法。而在<%%>中申明的变量被转化成_jspService方法中的局部变量。
3、 一个奇怪的现象,在<%! %>中第一一个成员变量,输出变量+1到前台,每次访问次数按理应该加1,但是代码被修改后再次访问时,加到一定的数字重归1。原因可能是Tomca内部的同步问题造成的。因为servlet是被同步访问的,所以尽量不要设置servlet的成员变量。
二、 常用jsp指令
1、 page的errorPage属性
在jsp页面中定义errorPage属性
<%@ page errorPage=”errorPage.jsp”%>
在errorPage.jsp中定义isErrorPage属性
<%@ page isErrorPage=”true”%>,可以使用内置对象exception,如果<%=exception.getMessage()%>
2、 include
(1) 静态包含<%@ include fiile=”titleBar.jsp”%>
在编译成servlet文件之前,将文件包含进来,被编译成一个servlet。包含文件和被包含文件访问的是同一个request对象。包含文件的时候不能传递参数,如<%@ include fiile=”TitleBar.jsp?user=123”%>是非法的。
(2) 动态包含<jsp:include fiile=”include.jsp”/>
包含文件和被包含文件分别编译成两个servlet;包含文件和被包含文件中的request内置对象是不同的,但是被包含文件的request可以访问包含文件所能访问的所有参数。包含文件的时候可以传递参数。
向包含页面传递参数:
<jsp:include page=”divide.jps” flush=”true”>
<jsp:param name=”v1” value=”%=value1%”/>
<jsp:param name=”v1” value=”%=value2%”/>
</jsp:include>
(3) <%@ include %>和<jsp:include>的区别
<%@ include file="date.jsp" %> |
<jsp:include page="date.jsp" flush="true"/> |
include指令是在JSP程序编译前将file属性所指定的程序内容嵌入,再编译成一个servlet的字节码文件; |
包含文件和被包含文件都被编译成相应的servlet字节码文件,在客户端请求时运行时载入包含文件的执行结果 |
include的file中不能带参数 |
<jsp:include>可以 |
包含页面和别包含页面使用同一个request对象 |
包含页面和被包含页面使用不同的request对象,被包含页面可以取得包含页面的参数,并可以在包含页面添加自己的参数(可以通过url或者通过指定jsp:param) |
常用 |
不常用 |
三、 response.sendForward()和<jsp:forward>的区别
Sendredirect |
Forward |
页面和转向页面使用不同的request,转向页面不能取得上一页面的参数 |
使用不同的request对象,但转向页面可以取到上一个页面的参数 |
send后的语句会继续执行,除非return |
forward后的语句不会继续发送给客户端 |
访问的原理是,客户端向服务端发送请求,服务器端浏览器发送转向指令,客户端再向服务器端发送请求(转向页面),服务器端把请求结果返回给客户端。需要客户端和服务器端的往返,所以速度慢 |
转向在服务器内部转化,所以速度比较快 |
可以转到任何页面 |
服务器内部转换,所以不能转向非项目内的页面 |
地址栏有变化 |
地址栏没有变化 |
可以传参数,直接写在url后面 |
可以传参数,即可写在url后面,也可以用指令<jsp:param> |
/代表的是http://127.0.0.1/ <%response.sendRedirect("/test/ServletToJSP");%> <form action="/test/ServletToJSP"> <a href="/test/ServletToJSP">test</a> |
this.getServletContext().getRequestDispatcher ("/servlet_jsp/ServletUseJsp.jsp") .forward(req, resp); 并且只能以/开头 |
常用 |
常用 |
四、 userBean
1、 创建bean对象
<jsp:useBean id=”cb” class=”bean.CounterBean”/>
相当于<%CounterBean cb=new CounterBean()%>
2、 设置属性值
<jsp:setProoerty name=”cb” property=”count” value=“12” />
其中的param=”name”,相当于request.getParameter(“name”);
相当于<%cb.setCount(23)%>
property=”*”时,相当于将表单中的同名属性复制给成员变量。
3、 获取属性值
<jsp:getProperty name=”cb” property=”count”/>
相当于<%=cb.getCount()%>
4、 scope参数有四个取值,分别为page(默认),request,session,application
如果scope=”request”,则相当于下面的代码
<%
bean.CounterBean counterBean=(bean.CounterBean)request.getAttribute(“counterBean”);
if(counterBean==null){
counterBean=new bean.CounterBean();
request.setAttribute(“counterBean”,counterBean);
}
%>
session和applicationt同理。
5、
五、 从servlet转到jsp
1、 使用forward方式
this.getServletContext().getRequestDispatcher(“”).forward(req,resp);
或者thisgetServletConfig().getServletContext().getRequestDispatcher(“”).forward(req,resp);
其中路径必须以/开头。
2、 使用sendRedirect方式
resp.sendRedirect(req.getContextPath()+””);
其中req.getContextPath()获得工程名/my