Servlet教程笔记

web文件夹下的html文件:

1 <form action="login" method="post">
2 User: <input type="text" name="name"><br>
3 Password: <input type="password" name="password"><br>
4 <input type="submit" value="login">
5 </form>

action为login, 对应的映射为 login  --> LoginServlet

点击submit后,自动跳转到/login

WEB-INF文件下的web.xml文件配置为:

1     <servlet>
2         <servlet-name>LoginServlet</servlet-name>
3         <servlet-class>LoginServlet</servlet-class>
4     </servlet>
5  
6     <servlet-mapping>
7         <servlet-name>LoginServlet</servlet-name>
8         <url-pattern>/login</url-pattern>
9     </servlet-mapping> 

比较两个值时,常量在前,避免空指针异常

tomcat实例化servlet,并调用其doGet或者doPost的方法,传入request和response;方法内一通操捯饬了以下response,tomcat拿到了response,根据response的内容,生成html字串,发给浏览器,浏览器根据http协议获取这个html字串,并渲染在界面上。

HttpServleti里的service源码 不必重写

607       protected void service(HttpServletRequest req, HttpServletResponse resp)
  608           throws ServletException, IOException {
  609   
  610           String method = req.getMethod();
  611   
  612           if (method.equals(METHOD_GET)) {
  613               long lastModified = getLastModified(req);
  614               if (lastModified == -1) {
  615                   // servlet doesn't support if-modified-since, no reason
  616                   // to go through further expensive logic
  617                   doGet(req, resp);
  618               } else {
  619                   long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
  620                   if (ifModifiedSince < (lastModified / 1000 * 1000)) {
  621                       // If the servlet mod time is later, call doGet()
  622                       // Round down to the nearest second for a proper compare
  623                       // A ifModifiedSince of -1 will always be less
  624                       maybeSetLastModified(resp, lastModified);
  625                       doGet(req, resp);
  626                   } else {
  627                       resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
  628                   }
  629               }
  630   
  631           } else if (method.equals(METHOD_HEAD)) {
  632               long lastModified = getLastModified(req);
  633               maybeSetLastModified(resp, lastModified);
  634               doHead(req, resp);
  635   
  636           } else if (method.equals(METHOD_POST)) {
  637               doPost(req, resp);
  638               
  639           } else if (method.equals(METHOD_PUT)) {
  640               doPut(req, resp);        
  641               
  642           } else if (method.equals(METHOD_DELETE)) {
  643               doDelete(req, resp);
  644               
  645           } else if (method.equals(METHOD_OPTIONS)) {
  646               doOptions(req,resp);
  647               
  648           } else if (method.equals(METHOD_TRACE)) {
  649               doTrace(req,resp);
  650               
  651           } else {
  652               //
  653               // Note that this means NO servlet supports whatever
  654               // method was requested, anywhere on this server.
  655               //
  656   
  657               String errMsg = lStrings.getString("http.method_not_implemented");
  658               Object[] errArgs = new Object[1];
  659               errArgs[0] = method;
  660               errMsg = MessageFormat.format(errMsg, errArgs);
  661               
  662               resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
  663           }
  664       }

service  doGet, doPost, service传参都是相同的

Servlet是单实例的,构造方法和初始化方法都只会执行一次

销毁:

1. 该Servlet所在的web应用重新启动

2. tomcat关闭

reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。
在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web应用的发存阶段将reloadable设为false。

服务端跳转

 request.getRequestDispatcher("success.html").forward(request, response); 

客户端跳转 

response.sendRedirect("fail.html"); 

servlet的生命周期 是在浏览器访问指定目录后才开始的,但有些情况又需要一开始就使用servlet的服务,所以需要自启动,自启动后在 init() 里可以进行一些业务代码的工作

 <load-on-startup>10</load-on-startup>  这里的10表示的是优先级,数字越低,越优先

---恢复内容结束---

web文件夹下的html文件:

1 <form action="login" method="post">
2 User: <input type="text" name="name"><br>
3 Password: <input type="password" name="password"><br>
4 <input type="submit" value="login">
5 </form>

action为login, 对应的映射为 login  --> LoginServlet

点击submit后,自动跳转到/login

WEB-INF文件下的web.xml文件配置为:

1     <servlet>
2         <servlet-name>LoginServlet</servlet-name>
3         <servlet-class>LoginServlet</servlet-class>
4     </servlet>
5  
6     <servlet-mapping>
7         <servlet-name>LoginServlet</servlet-name>
8         <url-pattern>/login</url-pattern>
9     </servlet-mapping> 

比较两个值时,常量在前,避免空指针异常

tomcat实例化servlet,并调用其doGet或者doPost的方法,传入request和response;方法内一通操捯饬了以下response,tomcat拿到了response,根据response的内容,生成html字串,发给浏览器,浏览器根据http协议获取这个html字串,并渲染在界面上。

HttpServleti里的service源码 不必重写

607       protected void service(HttpServletRequest req, HttpServletResponse resp)
  608           throws ServletException, IOException {
  609   
  610           String method = req.getMethod();
  611   
  612           if (method.equals(METHOD_GET)) {
  613               long lastModified = getLastModified(req);
  614               if (lastModified == -1) {
  615                   // servlet doesn't support if-modified-since, no reason
  616                   // to go through further expensive logic
  617                   doGet(req, resp);
  618               } else {
  619                   long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
  620                   if (ifModifiedSince < (lastModified / 1000 * 1000)) {
  621                       // If the servlet mod time is later, call doGet()
  622                       // Round down to the nearest second for a proper compare
  623                       // A ifModifiedSince of -1 will always be less
  624                       maybeSetLastModified(resp, lastModified);
  625                       doGet(req, resp);
  626                   } else {
  627                       resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
  628                   }
  629               }
  630   
  631           } else if (method.equals(METHOD_HEAD)) {
  632               long lastModified = getLastModified(req);
  633               maybeSetLastModified(resp, lastModified);
  634               doHead(req, resp);
  635   
  636           } else if (method.equals(METHOD_POST)) {
  637               doPost(req, resp);
  638               
  639           } else if (method.equals(METHOD_PUT)) {
  640               doPut(req, resp);        
  641               
  642           } else if (method.equals(METHOD_DELETE)) {
  643               doDelete(req, resp);
  644               
  645           } else if (method.equals(METHOD_OPTIONS)) {
  646               doOptions(req,resp);
  647               
  648           } else if (method.equals(METHOD_TRACE)) {
  649               doTrace(req,resp);
  650               
  651           } else {
  652               //
  653               // Note that this means NO servlet supports whatever
  654               // method was requested, anywhere on this server.
  655               //
  656   
  657               String errMsg = lStrings.getString("http.method_not_implemented");
  658               Object[] errArgs = new Object[1];
  659               errArgs[0] = method;
  660               errMsg = MessageFormat.format(errMsg, errArgs);
  661               
  662               resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
  663           }
  664       }

service  doGet, doPost, service传参都是相同的

Servlet是单实例的,构造方法和初始化方法都只会执行一次

销毁:

1. 该Servlet所在的web应用重新启动

2. tomcat关闭

reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。
在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web应用的发存阶段将reloadable设为false。

服务端跳转

 request.getRequestDispatcher("success.html").forward(request, response); 

客户端跳转 

response.sendRedirect("fail.html"); 

servlet的生命周期 是在浏览器访问指定目录后才开始的,但有些情况又需要一开始就使用servlet的服务,所以需要自启动,自启动后在 init() 里可以进行一些业务代码的工作

 <load-on-startup>10</load-on-startup>  这里的10表示的是优先级,数字越低,越优先

 1 import java.io.File;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileOutputStream;
 4 import java.io.InputStream;
 5 import java.io.PrintWriter;
 6 import java.util.Iterator;
 7 import java.util.List;
 8  
 9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13  
14 import org.apache.commons.fileupload.FileItem;
15 import org.apache.commons.fileupload.FileUploadException;
16 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
17 import org.apache.commons.fileupload.servlet.ServletFileUpload;
18  
19 public class UploadPhotoServlet extends HttpServlet {
20  
21     public void doPost(HttpServletRequest request, HttpServletResponse response) {
22  
23         String filename = null;
24         try {
25             DiskFileItemFactory factory = new DiskFileItemFactory();
26             ServletFileUpload upload = new ServletFileUpload(factory);
27             // 设置上传文件的大小限制为1M
28             factory.setSizeThreshold(1024 * 1024);
29             
30             List items = null;
31             try {
32                 items = upload.parseRequest(request);
33             } catch (FileUploadException e) {
34                 e.printStackTrace();
35             }
36  
37             Iterator iter = items.iterator();
38             while (iter.hasNext()) {
39                 FileItem item = (FileItem) iter.next();
40                 if (!item.isFormField()) {
41  
42                     // 根据时间戳创建头像文件
43                     filename = System.currentTimeMillis() + ".jpg";
44                     
45                     //获取当前目录,并在其后加上“uploaded”
46                     String photoFolder =request.getServletContext().getRealPath("uploaded");
47                     
48                     File f = new File(photoFolder, filename);
49                     f.getParentFile().mkdirs();                   //新建目录
50  
51                     // 通过item.getInputStream()        获取浏览器上传的文件的输入流
52                     InputStream is = item.getInputStream();
53  
54                     // 复制文件,丛输入流上读到bytes里,在从bytes写回到输出流
55                     FileOutputStream fos = new FileOutputStream(f);
56                     byte b[] = new byte[1024 * 1024];
57                     int length = 0;
58                     while (-1 != (length = is.read(b))) {
59                         fos.write(b, 0, length);
60                     }
61                     fos.close();
62  
63                 } else {
64                     System.out.println(item.getFieldName());
65                     String value = item.getString();
66                     value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
67                     System.out.println(value);
68                 }
69             }
70             
71             String html = "<img width='200' height='150' src='uploaded/%s' />";
72             response.setContentType("text/html");
73             PrintWriter pw= response.getWriter();
74             
75             pw.format(html, filename);
76             
77         } catch (FileNotFoundException e) {
78             // TODO Auto-generated catch block
79             e.printStackTrace();
80         } catch (Exception e) {
81             // TODO Auto-generated catch block
82             e.printStackTrace();
83         }
84     }
85 }

Dynamic web Project:

  直接在ide里运行的话,不用配置server.xml,但是还需要配置本项目的web.xml;

  classes在build里,如果有包名的话,web.xml里的servlet-class还是要加上包名;

  跑起来后,域名后要加上项目名在加上url-pattern

普通java项目转换为Dynamic web Project:

  Properties Facets  =>  Dynamic Web Module => Further configuration available  => content directory写web

猜你喜欢

转载自www.cnblogs.com/flipped415/p/11650500.html