Servlet服务器,转发,重定向

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状态码,从新发送一个新的请求。

相关文章
相关标签/搜索