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

 

6.1 Connecting to MySQL Using the JDBC DriverManager Interface

 1 public HeroDao(){//我把这句给你注释掉行不行??????
 2         try {
 3             Class.forName("com.mysql.jdbc.Driver");
 4         } catch(ClassNotFoundException e){
 5             e.printStackTrace();
 6         }
 7     }
 8     
 9 public Connection getConnection() throws SQLException{
10      return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", 
11               "****", "*****");
12 }

 

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

表示用UTF-8显示中文,同时浏览器也会使用UTF-8编码提交中文

request.setCharacterEncoding("UTF-8"); // / /Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader(). Otherwise, it has no effect

 

从request中取数据       request.getParameter("name"); //参数只能为String 

从数据库中取数据      执行完Statement获取 ResultSet,然后不停的next,  

1 ResultSet.getInt();
2 ResultSet.getString();    //Retrive XXX as a String
3 ResultSet.getFloat();

 

 

Class.forName()

 1     /*
 2     public HeroDao(){//我把这句给你注释掉行不行??????
 3         try {
 4             Class.forName("com.mysql.jdbc.Driver");
 5         } catch(ClassNotFoundException e){
 6             e.printStackTrace();
 7         }
 8     }*/
 9     
10     public Connection getConnection() throws SQLException{
11         return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", 
12                 "root", "admin");
13     }
14    



报错: No suitable driver found for jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8

https://www.cnblogs.com/xingzc/p/5760166.html   讲述了forName(String).newInstance()和new的区别,以及不实例只是为了动态加载类。
DriverManager会在已经登记了的驱动里选择合适的,翻一翻能看到比较有趣的东西   getConnection -> ClassLoader

1         String trFormat = "<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td><td><a href='editHero?id=%d'>edit</a></td><td><a href='deleteHero?id=%d'>delete</a></td></tr>\r\n";
2 
3         for (Hero hero : heros) {
4             String tr = String.format(trFormat, hero.getId(), hero.getName(), hero.getHp(), hero.getDamage(),hero.getId(),hero.getId());
5             
6             sb.append(tr);
7         }

 

每一行数据都是都是已经做好的String,editHero?=%d 已经写好了,点击edit直接转入 /editHero?id=XXX     /editHero 映射到  HeroEditServle 

HeroEditServlet打印出HTML,HTML form的action为 /updateHero ,  跳转到 连同修改值上传的还有类型为 hidden 的id值

 

posted on 2019-10-15 21:04  Vitavi  阅读(146)  评论(0编辑  收藏  举报

导航