Servlet/JSP入门学习笔记

servlet

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。
注意:在老JSP中输入的参数如果名称符合也会传入给新的JSP。如在新JSP中含有ccc参数,则,在老JSP中如果通过URL给ccc赋值(如:http://localhost:8080/test/xxx.jsp?ccc=“aaa”),新JSP仍会得到该值。原因是这两个JSP共用了一个request对象jsp:forwardresponse.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"/>
..

猜你喜欢

转载自blog.csdn.net/timemagician/article/details/80695826
今日推荐