一,Servlet入门
1,所有的Servlet都要实现Servlet接口,它的services()(对外提供服务)方法会被容器直接调用,但是一般我们继承HttpServlet类,它是GenericServlet的子类(实现了Servlet接口)。services()方法会调用doGet(),doPost()等方法,挡在浏览器中输入url时会调用doGet()方法,在表单以post方式提交时会调用doPost()方法。
public class HelloWordServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); PrintWriter out =resp.getWriter(); out.write("go");//客户端呈现 } }
HttpServletRequest :封装了客服端到服务器端的一系列的请求。
HttpServletResponse :从服务器返回给客户端的内容。 2,在web.xml中的配置
HelloWorldServlet HelloWorldServlet HelloWorldServlet /HelloWorldServlet
二,Servlet的生命周期
在webapplication整个生命过程中,servlet只new一次,所以代码在后台只输出一次constructor,只初始化一次,输出一次init。只有webapplication退出的时候才执行destroy()方法。
public class TestLifeCycleServlet extends HttpServlet { public TestLifeCycleServlet() { System.out.println("constructor"); } public void init() throws ServletException { System.out.println("init"); } public void destroy() { System.out.println("destroy"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doGet"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
执行结果:
- 生命全过程:
- 加载 ClassLoader
- 实例化 new
- 初始化 init(ServletConfig)
- 处理请求 service doGet doPost
- 退出服务 destroy()
- 只有一个对象
- API中的过程:
- init()//只执行一次, 第一次初始化的时候
- public void init( config) throws
- init()//只执行一次, 第一次初始化的时候
-
- service()
- public void service( req, res) throws , java.io.IOException
- destroy()//webapp 退出的时候
- public void destroy()
- service()
三,Servlet编程接口
- GenericServlet是所有Servlet的鼻祖
- 用于HTTP的Servlet编程都通过继承 javax.servlet.http.HttpServlet 实现
- 请求处理方法:(分别对应http协议的7种请求)
- 实例的个数:
四,request获取请求的参数
public class ShowParameters extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Reading All Request Parameters"; out.println("读取所有参数 " + "\n" + "" + title + "
\n" + "
Parameter Name | Parameter Value(s)"); Enumeration paramNames = request.getParameterNames();//Enumeration 一个过时的接口,存放参数名 while(paramNames.hasMoreElements()) { String paramName = (String)paramNames.nextElement(); out.print(" |
---|---|
" + paramName + "\n | "); String[] paramValues = request.getParameterValues(paramName); if (paramValues.length == 1) { String paramValue = paramValues[0]; if (paramValue.length() == 0) out.println("No Value"); else out.println(paramValue); } else { out.println("
|
- 获取表单信息
- 通过HttpServletRequest的getParameter()方法来获得客户端传递过来的数据
- getParameter()方法返回一个字符串类型的值
- getParameterNames()返回Enumeration类型的值,getParameterValues()返回一个字符串数组
五,Cookies(记录在客户端)
1,由于http是无状态的协议,它不知道client以前在我这做过什么事情,所以要用到cookie
2,处理Cookie
- Http协议的无连接性要求出现一种保存C/S间状态的机制
- Cookie:保存到客户端的一个文本文件,与特定客户相关
- Cookie以“名-值”对的形式保存数据
- 创建Cookie:new Cookie(name,value)
- 可以使用Cookie 的setXXX方法来设定一些相应的值
- setName(String name)/getName()
- setMaxAge(int age)/getMaxAge()
- 利用HttpServletResponse的addCookie(Cookie)方法将它设置到客户端
- 利用HttpServletRequest的getCookies()方法来读取客户端的所有Cookie,返回一个Cookie数组
//response设置cookie for(int i=0; i<3; i++) { // Default maxAge is -1, indicating cookie // applies only to current browsing session. Cookie cookie = new Cookie("Session-Cookie-" + i, "Cookie-Value-S" + i); response.addCookie(cookie); cookie = new Cookie("Persistent-Cookie-" + i, "Cookie-Value-P" + i); // Cookie is valid for an hour, regardless of whether // user quits browser, reboots computer, or whatever. cookie.setMaxAge(3600); response.addCookie(cookie);
//request获取cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { Cookie cookie; for(int i=0; i\n" + " " + cookie.getName() + "\n" + " " + cookie.getValue()+"\n"); }
3,当new一个cookie时,若没有设置存活周期,则它存在于这个浏览器窗口打开期间,它的窗口及其子窗口可以访问cookie,相当于cookie写在了内存中.如果设置了存活周期,则会写在本地文件中。
- 服务器可以向客户端写内容
- 只能是文本内容
- 客户端可以阻止服务器写入
- 只能拿自己webapp写入的东西
- Cookie分为两种
- 属于窗口/子窗口(放在内存中的)
- 属于文本(有生命周期的)
- 一个servlet/jsp设置的cookies能够被同一个路径下面或者子路径下面的servlet/jsp读到 (路径 = URL)(路径 != 真实文件路径)
六,Session(记录在服务器端)
1, 当打开一个浏览器窗口生成session时,就会自动生成一个sessionid,这个sessionid会在浏览器窗口打开期间一直存在,直到该窗口连同浏览器一起关掉(在不关该浏览器的情况下,另打开一个该浏览器,可以访问原来的session),若在其他类型浏览器中打开则访问不到。(疑问:前面括号的东西和所看视频不一致(一个窗口对应一个sessionid),自己试验的可以。。。)
- Session
- 在某段时间一连串客户端与服务器端的“交易”
- 可以通过程序来终止一个会话。如果客户端在一定时间内没有操作,服务器会自动终止会话。在Tomcat中的web.xml里默认设置了session的存活时间,当然你也可以在自己的 配置文件里设置。
30
- 通过HttpSession来读写Session
- 规则
- 如果浏览器支持Cookie, 创建Session的时候会把SessionID保存在Cookie里
- 如果不支持Cookie, 必须自己编程使用URL重写的方式实现Session
- response.encodeURL()
- 转码
- URL后面加入SessionId
- Session不象Cookie拥有路径访问的问题
- 同一个application目录下的servlet/jsp可以共享同一个session, 前提是同一个客户端窗口.
2,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的常用方法
- getAttributeNames()/getAttribute()
- getCreateTime()
- getId()
- getMaxInactiveInterval()
- invalidate()
- isNew()
- setAttribute() //session是以键值对的形式存储的,可以用此方法写session
- setMaxInactivateInterval()
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //get current session or, if necessary, create a new one HttpSession mySession = request.getSession(true); //MIME type to return is HTML response.setContentType("text/html"); //get a handle to the output stream PrintWriter out = response.getWriter(); //generate HTML document out.println(""); out.println(""); out.println("Session Info Servlet "); out.println(""); out.println(""); out.println("Session Information
"); out.println("New Session: " + mySession.isNew()); out.println("Session ID: " + mySession.getId()); out.println("Session Creation Time: " + new java.util.Date(mySession.getCreationTime())); out.println("Session Last Accessed Time: " + new java.util.Date(mySession.getLastAccessedTime())); out.println("Request Information
"); out.println("Session ID from Request: " + request.getRequestedSessionId()); out.println("Session ID via Cookie: " + request.isRequestedSessionIdFromCookie()); out.println("Session ID via rewritten URL: " + request.isRequestedSessionIdFromURL()); out.println("Valid Session ID: " + request.isRequestedSessionIdValid()); out.println("refresh"); out.println(""); out.close(); //close output stream }
public class ShowSession extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Session Tracking Example"; HttpSession session = request.getSession(true); String heading; // Use getAttribute instead of getValue in version 2.2. Integer accessCount = (Integer)session.getValue("accessCount"); if (accessCount == null) { accessCount = new Integer(0); heading = "Welcome, Newcomer"; } else { heading = "Welcome Back"; accessCount = new Integer(accessCount.intValue() + 1); } // Use setAttribute instead of putValue in version 2.2. session.putValue("accessCount", accessCount); out.println("Session追踪 " + "\n" + "" + heading + "
\n" + "Information on Your Session:
\n" + "
Info Type | Value\n" + " |
---|---|
ID\n" + " | " + session.getId() + "\n" + " |
Creation Time\n" + " | " + new Date(session.getCreationTime()) + "\n" + " |
Time of Last Access\n" + " | " + new Date(session.getLastAccessedTime()) + "\n" + " |
Number of Previous Accesses\n" + " | " + accessCount + "\n" + " |
七,Application
- 用于保存整个WebApplication的生命周期内都可以访问的数据(可以在不同的窗口和不同的浏览器中得到,所有的客服端共享)
- 在API中表现为ServletContext
- 通过HttpServlet的getServletContext方法可以拿到
- 通过ServletContext的 get / setAttribute方法取得/设置相关属性
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=gb2312"); PrintWriter out = response.getWriter(); ServletContext application = this.getServletContext(); Integer accessCount = (Integer) application.getAttribute("accessCount"); if (accessCount == null) { accessCount = new Integer(0); } else { accessCount = new Integer(accessCount.intValue() + 1); } // Use setAttribute instead of putValue in version 2.2. application.setAttribute("accessCount", accessCount); out.println("Session追踪 " + "\n" + "" + accessCount + "\n" + "\n" + "" + "
\n"); }
八,Servlet中使用Bean
- 广义javabean = 普通java类
- 狭义javabean = 符合Sun JavaBean标准的类
- 在Servlet中使用Bean和在通常程序中使用Bean类似
- 属性名称第一个字母必须小写,一般private,
- 比如:private productId
- 一般具有getters and setters
- 要具有一个参数为空的构造方法
- 但Bean不应具有GUI表现
- 一般是用来实现某一业务逻辑或取得特定结果