1、Servlet服务器php
一、Servlet的生命周期:html
(1) Servlet的建立时间:java
a. 浏览器第1次请求服务器的时候建立。web
b. 在服务器运行的会后建立。(即在web.xml 文件中用 load-on-startup 配置建立)数据库
// b. 配置 <servlet> <servlet-name>ActionServlet</servlet-name> <servlet-class>com.wx.etc.ctrol.ActionServlet</servlet-class> <!-- 配置应用启动时,建立Servlet实例 --> <load-on-startup>0</load-on-startup> </servlet> //解释说明:配置<load-on-startup>0</load-on-startup>:标记Tomcat容器是否在启动的时候就加载这个servlet. (1) 当值为0或者大于0时,表示容器在应用启动时就加载这个servlet; (2) 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。 (3) 正数的值越小,启动该servlet的优先级越高。
(2) Servlet会执行 初始化 init( ) 方法(只执行一次),而后执行 Service 方法 或者 doGet()/doPost()。下一次请求过来,会直接执行Service方法。服务器关闭时,会调用destroy( )方法进行销毁。浏览器
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。所以,开发人员在编写Servlet时,一般只须要覆写doGet或doPost方法,而不要去覆写service方法缓存
//1. 实现 Servlet 接口 public class XxServlet implements Servlet{ @Override public void destroy() { } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig arg0) throws ServletException { } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { } } // 2. 继承 HttpServlet 类。 public class XxServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } } // 注意: 若出现405状态码: get请求进入了doPost()方法中处理了。 能够在doGet()方法中加上 doPost(request,respopnse); 在 doPost()方法中加上 doGet(request,response);
(3) Servlet中获取 url 请求路径:安全
String uri=request.getRequestURI(); String path=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf(".")); if("/DeptListAllServlet".equals(path)){ List<Dept>list=dao.findAllDept(); HttpSession session=request.getSession(); session.setAttribute("list", list); response.sendRedirect("./dept/DeptList.jsp"); return; } if("/updatedept".equals(path)){ int id=Integer.parseInt(request.getParameter("id")); Dept dept=dao.findDeptById(id); //根据id获取到该Id所对应的部门信息 request.setAttribute("dept", dept); request.getRequestDispatcher("./DeptMod.jsp").forward(request, response); return; } ...
// 在 web.xml 中配置 Servlet的访问路径 <servlet> <servlet-name>ActionServlet</servlet-name> <servlet-class>com.wx.etc.ctrol.ActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
二、Get 和 Post 请求的区别:服务器
(1) get请求 进行数据提交,Form表单的数据会显示在地址栏中 ,get 请求携带的数据量 较小,get请求的安全性比较低。session
// GET请求实例 GET http://weibo.com/signup/signup.php?inviteCode=2388493434 Host: weibo.com Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
GET请求,请求的数据会附加在URL以后,以?分割URL和传输数据,多个参数用&链接。URL的编码格式采用的是ASCII编码,而不是uniclde,便是说全部的非ASCII字符都要编码以后再传输。
(2) post请求 进行数据提交时,Form表单的数据不会显示在地址栏上,post请求携带的数据量较大,post请求安全性高。
//POST请求实例: POST /inventory-check.cgi HTTP/1.1 Host: www.joes-hardware.com Content-Type: text/plain Content-length: 18 item=bandsaw 2647
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。
所以,GET请求的数据会暴露在地址栏中,而POST请求则不会。
一默认状况下,表单提交的是GET请求,若是改为POST请求,在Form表单中加上,method=“post”。
3. HTTP 请求与响应:
HTTP的请求格式:
<method> <request-URL> <version> <headers> <entity-body>
HTTP的响应报文格式:
<version> <status> <reason-phrase> <headers> <entity-body> // status,状态码描述了请求过程当中发生的状况 // reson-phrase 是数字状态码的可读版本 // 常见的状态码以及含义以下: // 200 OK 服务器成功处理请求 // 301/302 Moved Permanently(重定向)请求的URL已移走。响应报文中应该包含一个Location URL,说明资源如今所处的位置 // 304 Not Modified(未修改) 客户的缓存资源是最新的,要客户端使用缓存内容 // 404 Not Found 未找到资源 // 501 Internal Server Error 服务器遇到错误,使其没法对请求提供服务
http数据包 包括如下 几部分:
请求头:
请求方式(get/post)
请求的URL
若干的消息头
实体内容:
当为 POST 请求,提交的数据会放在实体内容里面
若是是 GET 请求 ,提交的数据在URL中
二. 转发 和 重定向
1. 服务器向浏览器发送请求,默认是 转发。
2. 转发 与 重定向 的区别。
(1) 转发 : 地址栏不变。只能转发 到当前web 应用的路径(Servlet路径,JSP)。只发生一次请求:A---->C
request.getRequestDispatcher("/xx.jsp").forward(request,response); // 解释: // .forward(request,response) 用来向下一个 JSP页面/Servlet 传递参数。
应该尽可能避免使用转发,要适时而用。由于是从 地址栏中 获取到参数,因此一刷新页面 地址栏,即进行相应的数据库。
(2) 重定向:地址栏 发生改变。产生一个新的请求,能够从新定位到一个新的应用路径(能够是外部应用,也能够是不一样的web工程)。发生两次请求:A---->B , B---->C
response.sendDirect("/*.do"); // response.sendDirect("/xx.jsp");
A---->B 将 地址栏中 http://localhost:8080/web项目名/addUser.do?key=value 值 的url路径 改变 产生一个302状态码,B---->C :是经过302状态码,从新发送一个新的请求。