servlet
Cookie
Cookie采用name-value的方式保存,用于弥补http的无状态无连接的特性。
Cookie可以分为两种,一种是未设置生存周期的临时性的,一旦网页关闭就会消失。并且临时性Cookie只能通过本窗口和其衍生的子窗口打开,新建的独立窗口是没法打开临时性Cookie的。
另一种是设置了生存时间的Cookie,该类Cookie会在生存周期内缓存于客户端账户,到时间自动删除。 addCookie
用于response,getCookies
用于request。
一个servlet/jsp设置的Cookie只能被同一路径(URL)及其子路径的servlet读取,对于不同URL的servlet不能读取其Cookie。
Session
存放于服务器端。和窗口一一对应,窗口关闭则Session随之不可用。注意,子窗口和窗口共享一个Session。
2种实现方式:通过Cookie实现和通过URL实现。
如果浏览器支持Cookie,则通过Cookie实现:将SessionID存在临时性Cookie之中。
若不支持Cookie,则通过URL实现:通过服务端创建一块区域用于存储客户信息,该区域成为Session,并且由唯一的SessionID进行识别。服务端在创建好Session后会将SessionID发给客户端,客户端可以在之后每次访问时,在URL中加入该ID进行访问该Session(服务端通过response.encodeURL()
进行SessionID编码)。
在同一个客户端窗口的前提下,同一个application的所有servlet/JSP都可以访问同一个Session。
Web application
存放于服务器端。
被所有servlet/JSP共享。其获得方法是getServletContext()
详见:ServletContext
JSP
JSP实际是为了改善servlet中html语言都要在print中输出的麻烦,换了一种形式,改成主要的是html语句,在需要输出的地方才用Java语句。不过JSP本质还是servlet,因为一个JSP文件最后还是先编译成servlet.java,然后再编译成servlet.class进行运行的。因此在一开始加载一个JSP文件时,会比较慢。不过由于servlet只加载一次的特性,由此在后续使用中不会对服务器响应时间造成太大影响。
基础语法
<%...%>
Scriptlet脚本语句
在<%...%>
中可以直接编写Java语句,并且输出流默认用out.printf()。要注意的是<%...%>
其实是在方法中进行Java程序编写,因此不可以再方法里声明静态变量,也不能继续声明方法。
注释方法:<!--..-->
(html注释,客户端可以看见);<%--...--%>
(客户端不可见);<%/*...*/%>
(Java注释,客户端不可见)
<%!...%>
Declaration声明语句
在<%!...%>
声明的变量其实是类的实例域,而在<%...%>
中声明的变量其实是方法doGet()
等的方法域内的方法变量。这是要小心的地方。
<%=...%>
Expression表达式语句
在该语句下,内部表达式(变量)语句内容会原样输出,适合在html语境中进行赋值使用。注意表达式必须是String变量或者编写了toString()方法的变量。
<%@指令名 属性='属性值'%>
Direction编译指令语句
该语句用于在编译期间对JSP文件进行一系列的定义,如编码集的选定。
指令名:常用的指令名有page,include,taglib
page对应的部分属性有:
- import:指明引用了哪些类(逗号隔开类);
- session:true(default)/false,是否可以直接用session表示session对象;
- errorPage:用于在当前页面出错时,转向其他页面;
- isErrorPage:true/false,表示该页面是否是在其他页面出错时转到该页面才会显示。
- contentType:页面的格式和编码集
include的属性:<%@include file='fileURL'%>
该语句会在编译期间就将文件包含进来作为本JSP的一部分,然后执行时就不用再去查找该文件进行调用了。
注意:fileURL内不可以包含参数,因为该指令还未运行,包含没用。所以incldue常用来包含非动态JSP。
<jsp:action ... />
Action动作指令
常见的Action:
- jsp:useBean
- jsp:setProperty
- jsp:getProperty
- jsp:include
- jsp:forward
- jsp:param
- jsp:plugin
jsp:include
/jsp:param
:
常将两个action指令合并使用,前者调用其他JSP,后者将具体参数传入调用的JSP之中。如下:
<jsp:include page="xxx.jsp" flush="true"/>
<jsp:param name="param1OfJSP" value="aaa"/>
<jsp:param name="param2OfJSP" value="bbb"/>
..
</jsp:include>
jsp:forward page="xxx.jsp"
/jsp:param
:
该组合指令用于跳转页面,即当执行到该句后,将执行跳转动作,将当前窗口跳转到新JSP,并且可以配合一系列的jsp:param
将参数传给新的JSP。
注意:在*SP中输入的参数如果名称符合也会传入给新的JSP。如在新JSP中含有ccc
参数,则,在*SP中如果通过URL给ccc
赋值(如:http://localhost:8080/test/xxx.jsp?ccc=“aaa”),新JSP仍会得到该值。原因是这两个JSP共用了一个request对象。jsp:forward
与response.sendRedirect("xxx.jsp")
区别:jsp:forward
是跳转的意思,前面已说明。response.sendRedirect("xxx.jsp")
则是重定向的意思。具体的区别是,前者在输入URL后,会自动跳转到新JSP,并将同一个request传过去。在URL中不现实新跳转的JSP(因为用的还是原来的request嘛)。后者则是当客户端访问含有重定向的JSP时,服务器会自动告诉客户端别访问我,访问另一个xxx.jsp,由此,客户端会重新发起一个request去访问哪个新的xxx.jsp,因此会在URL上发生改变。并且!通过URL传递参数来访问包含response.sendRedirect("xxx.jsp")
的jsp时,xxx.jsp是没法收到之前传递的参数的(因为request不同了)。
jsp:useBean
:
该命令用于以html标签语言的方式调用Java类。正因为JavaBean类要求实现setXXX,getXXX等方法,才使得将JavaBean类转换成html方式成为可能。具体用法详见:JSP JavaBean
scope范围解释:
- page:JavaBean实例在当前页面有效。新建页面将重新实例化一个新的JavaBean类的实例。
- request:JavaBean实例在同一个request内有效,比如使用
jsp:forward
来跳转时,就不用新实例化一个新的JavaBean类的实例。 - session:在同一窗口及其子窗口中有效。存放于session之中。
- application:在整个WebApplication运行期间都有效,即存放于ServletContext之中。
举个例子,比如登陆时的用户名和密码的JavaBean类实例其Scope就应该时request的。而登陆之后的各个页面的跳转都要保持登陆状态,则可以使用session的范围。如果是网站的搭建需要的JavaBean则应该是application范围的,如访问人数统计。
jsp:setProperty
/jsp:getProperty
:
其本质是通过Java内部的反射机制来调用其对应的get/set方法。
value与param的区别:
name确定了JavaBean实例的名字,property确定对应的方法,对应参数有value和param两种,value=将值赋给value;param=将request内的参数名赋给param,然后get方法会自动其获得相对应的值(在setProperty中使用param时jsp还会自动转换参数的类型,从String自动转换成别的类型)。
一些需要注意的地方:
property="*"
的使用情况:
当jsp为提交的表单数据时,我们可以使用jsp:forward
跳转页面并通过request传递参数,此时,可以采用property="*"
的参数设定将request中的参数依次传入新jsp中的JavaBean实例中。手写不建议使用该方法,常见于struts框架中
<%request.setCharaterEncoding("GBK");%>
语句的作用是改变request中的信息编码方式,因为常用的编码方式是欧美的ISO编码集,对于中文,该编码集不能正确表示,因此需要我们进行转码,由此就要在从request中取参数前调用该语句。
JSP内置对象
- out
- request
- response
- pageContext(表示page的环境区域,不常用,在编写类似Tomcat类似的程序可能会用到)
- session
- application
- config(表示web.xml相关的配置,用的较少)
- exception
- page(表示当前页面,很少用)
JSP与servlet的跳转
servletToJSP
常采用如下命令:
public void doGet(HttpServletRequest request, HttpServletResponse response){
..
this.getServletConfig().getServletContext().getRequestDispatcher
("/XXX.jsp").forward(request,response);
..
}
JSPToservlet
..
<jsp:forward page="对应servlet的URL"/>
..