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