Servlet 指服务器小应用程序,用来完成B/S构架下客户请求的响应处理。
1 Web Application 简介(符合j2ee标准的web-app的目录结构)
实例:在tomcat 6.0.14 下 webapps 下建名为my 的 Web Application
2一Class、两个Interface、两个重要方法
l Class HttpServlet
Provides an abstract class to be subclassed to create an HTTP servlet suitable for a Web site. A subclass of HttpServlet must override at least one method, usually one of these:
l Interface HttpServletRequest
Extends the ServletRequest
interface to provide request information for HTTP servlets.
The servlet container creates an HttpServletRequest
object and passes it as an argument to the servlet's service methods (doGet
, doPost
, etc).
The servlet container 指的就是Tomcat
l Interface HttpServletResponse
Extends the ServletResponse
interface to provide HTTP-specific functionality in sending a response. For example, it has methods to access HTTP headers and cookies.
The servlet container creates an HttpServletResponse
object and passes it as an argument to the servlet's service methods (doGet
, doPost
, etc).
l protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {}
当客户端的请求以Get的方式到达时,Tomcat会调用此方法,调运具体过程见下:
1 |
2 |
3 |
4 |
服务器请求到达Tomcat |
Tomcat找到Service()方法 |
Service()方法找到被保护的Service()方法 |
被保护的Service()方法做最后处理 |
Tomcat 调用doGet()方法时传进来两个参数:req和resp,类型分别为上述两接口;
Req中包含有客户端信息,如IP地址、Form表单中参数;
Resp表示到客户端的应答;
l protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException, IOException){}
说明同上
3 比较:Servlet GenericServlet HttpServlet
javax.servlet.servlet是个接口, Defines methods that all servlets must implement.没有考虑程序在HTTP服务器下还是在FTP服务器下,是通用的接口,没有考虑到HTTP协议的细节.
javax.servlet.GenericServlet是一个类,实现上面的接口, Defines a generic, protocol-independent servlet. To write an HTTP servlet for use on the Web, extend HttpServlet
instead. 同样,它也没有考虑到HTTP协议的细节.
但是,javax.servlet.GenericServlet还可以实现其他的接口还可以继承一个类.因为java语言可以实现多个接口.所以,它还会有其他的一些方法. 实际上javax.servlet.GenericServlet实现了这么几个接口: java.io.Serializable, Servlet, ServletConfig 继承了object这个对象.
javax.servlet.http.HttpServlet是一个类,继承了javax.servlet.GenericServlet, 那么GenericServlet有的方法它都有,而且还有自己的方法.
考虑到HTTP协议的细节问题,用于处理HTTP服务器下处理HTTP请求的响应.
4 比较:URL 路径
在my目录下面建立t.html文件
等价,“/”相当于http://localhost:8080 |
在 下面web.xml中
等价,“/”相当于http://localhost:8080/my
|
5 乱码处理
场合:页面本身有中文的时候 解决办法:servlet:resp.setContentType("text/html;charset=gbk"); Jsp: <%@ page contentType="text/html;charset=gb2312"%> 注意:一定要写在PrintWriter out = resp.getWriter();之前 |
场合:解决get方式乱码问题: 解决办法:修改server.xml àURIEncoding="GBK" |
场合:解决post方式提交内容的乱码 解决办法:request.setCharacterEncoding("GBK"); 注意:一定要写在存取第一个参数之前 不要调用response.setCharacterEncoding("GBK"); |
场合:<jsp:param name="user" value="<%=s%>"/>,url地址包含中文参数 解决办法:<%request.setCharacterEncoding("GBK");%> 注意: |
第一个客户端请求到来时执行一次,所以只有一个对象 |
³
多线程处理,线程池,可以满足多个客户端请求同时访问 |
退出服务 destroy()
³ 只有一个对象
³ 不要在Servlet中设定成员变量
1 两个init()解释:
2 Cookie
位于javax.servlet.http包下面
Http协议的无连接性要求出现一种保存C/S间状态的机制
Cookie:保存到客户端的一个文本文件,与特定客户相关
Cookie以“名-值”对的形式保存数据
创建Cookie:new Cookie(name,value)
可以使用Cookie 的setXXX方法来设定一些相应的值
setName(String name)/getName()
setValue(String value)/getValue()
setMaxAge(int age)/getMaxAge()
l 利用HttpServletResponse的addCookie(Cookie)方法将它设置到客户端
l 利用HttpServletRequest的getCookies()方法可以从服务器端取出Cookie
1:服务器可以向客户端写内容
2:只能是文本内容
3:客户端可以阻止服务器写入
4:只能拿自己webapp写入的东西
5:Cookie分为两种
属于窗口/子窗口(放在内存中的)
属于文本(有生命周期的)
6:一个servlet/jsp设置的cookies能够被同一个路径下面或者子路径下面的servlet/jsp读到,反之则不能;
3 Session
³ 与Cookie的最大不同:存储位置不同,session存在服务器端,而Cookie存储于客户端;
Cookie只能存文本内容,大小有限,session较灵活,易于编程控制;
Session的实现要建立在Cookie的基础之上。
³ Session
在某段时间一连串客户端与服务器端的“交易”
在Jsp/Servlet中,如果浏览器不支持Cookie,可以通过URL重写来实现,就是将一些 额外数据追加到表示会话的每个URL末尾,服务器在该标示符与其存储的有关的该会话的数据之间建立关联。如hello.jsp?jsessionid=1234
可以通过程序来终止一个会话。如果客户端在一定时间内没有操作,服务器会自动终止会话。
通过HttpSession来读写Session
³ 规则
如果浏览器支持Cookie, 创建Session的时候会把SessionID保存在Cookie里
如果不支持Cookie, 必须自己编程使用URL重写的方式实现Session
response.encodeURL()
转码
URL后面加入SessionId
Session不象Cookie拥有路径访问的问题
同一个application下的servlet/jsp可以共享同一个session, 前提示同一个客户端窗口.
³ HttpServletRequest中的Session管理方法
getRequestedSessionId():返回随客户端请求到来的会话ID。可能与当前的会话ID相同,也可能不同。
getSession(boolean isNew):如果会话已经存在,则返回一个HttpSession,如果不存在并且isNew为true,则会新建一个HttpSession
isRequestedSessionIdFromCookie():当前的Session ID如果是从Cookie获得,为true
isRequestedSessionIdFromURL():当前Session ID如果是由URL获得,为true
isRequestedSessionIdValid():如果客户端的会话ID代表的是有效会话,则返回true。否则(比如,会话过期或根本不存在),返回false
HttpSession的常用方法
n getAttributeNames()/getAttribute()
n getCreateTime()
n getId()
n getMaxInactiveInterval()
n invalidate()
n isNew()
n setAttribute()
n setMaxInactivateInterval()
³ Session总结
l 服务器的一块内存(存key-value)
l 和客户端窗口对应(子窗口)(独一无二)
l 客户端和服务器有对应的SessionID
l 客户端向服务器端发送SessionID的时候两种方式:
l cookie(内存cookie)
l rewriten URL
l 浏览器禁掉cookie,就不能使用session(使用cookie实现的session)
l 如果想安全的使用session(不论客户端是否禁止cookie),只能使用URL重写(大大增加编程负担),所以很多网站要求客户端打开cookie
10 ServletContext
³ 用于保存整个WebApplication的生命周期内都可以访问的数据
³ 在API中表现为ServletContext
³ 通过HttpServlet的getServletContext方法可以拿到
³ 通过ServletContext的 get / setAttribute方法取得/设置相关属性
Servlet中的请求转发
³ RequestDispatcher接口对象允许将请求转发到其他服务器资源
³ 通过RequestDispatcher的forward(HttpServletRequest,HttpServletResponse)方法可以将请求转发
³ 通过ServletContext的getRequestDispatcher(String url)方法来获得RequestDispatcher对象,并且指定转发的目标url资源
³ 可以通过HttpServletRequest的setAttribute(String name,String value)来设置需要传递的参数,然后在代理servlet中就可以使用HttpServerRequest的getAttribute(String name)来获得对应的值
11-Javabean
Ø 广义javabean = 普通java类
Ø 狭义javabean = 符合Sun JavaBean标准的类
Ø 在Servlet中使用Bean和在通常程序中使用Bean类似
u 属性名称第一个字母必须小写,一般private,比如:private productId
u 一般具有getters and setters
u 要具有一个参数为空的构造方法
u 但Bean不应具有GUI表现
u 一般是用来实现某一业务逻辑或取得特定结果