Servlet介绍(web服务器处理网络请求的程序)

Servlet基本知识:

  每一个url(例如https://i.cnblogs.com/EditPosts.aspx?opt=1)都对应一个Servlet ;

  URL的组成:服务器地址:端口号/虚拟项目名 /servlet 的别名 

  服务器根据虚拟项目名加servlet别名可以唯一地找到一个Servlet来对该网页请求作出相应;

  Servlet其实就是一个继承 HttpServlet的java类,所以所有的java包都可以用;

编写Servlet基本流程

  • 1、 创建普通的 java 类并继承 HttpServlet
  • 2、 覆写 service 方法(或者doGet或doPost方法)
  • 3、 在 service 方法中书写逻辑代码即可
  • 4、 在 webRoot 下的 WEB-INF 文件夹下的 web.xml文件中配置 servlet

  配置web.xml的作用:浏览器发起的请求采用的是Servlet的别名,如何根据别名找到对应的Servlet,这就要通过web.xml;这样做的原因是为了安全;

具体如何配置web.xml呢?

 主要就配置<servlet><servlet-mapping>

  <servlet-name>:表示Servlet的别名

  <servlet-class>:表示Servlet的真实路径

  <url-pattern>:表示浏览器访问时,用的别名

浏览器请求时的具体寻找Servlet方式:

  1,浏览器通过<url-pattern>的别名访问,

  2,服务通过Servlet-mapping标签寻找到servelt-name

  3,然后通过servelt标签找到Servlet的真实路径,

  4,然后通过反射加载这个Servlet,进行数据处理,然后返回数据到客户端;

  Servlet的寿命就是从服务器反射加载后到服务器关闭;

我们复写service 方法或者doGetdoPost方法都会有两个参数 

service(HttpServletRequest req, HttpServletResponse resp)//req是Request 对象,resp是Response对象

Request 对象

  浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器。那浏览器接收到请求数据要怎么办呢?当然要存起来。Request 对象就是封装好请求数据的一个对象,我们可以通过Request 对象获取浏览器发来的数据;(其实不止浏览器发来的数据,还有封装起来的很多很有用的方法,后面再讲)

Request获取一些基本数据的方式

  * 获取请求头数据(http协议分为三部分,不同部分获取方式有点不一样)

    * req.getMethod();//获取请求方式

    * req.getRequestURL();//获取请求URL信息

    * req.getRequestURI();//获取请求URI信息

    * req.getScheme();//获取协议

  * 获取请求行数据

    * req.getHeader("键名");//返回指定的请求头信息

    * req.getHeaderNames();//返回请求头的键名的枚举集合

  * 获取用户数据

    * req.getParameter("键名");//返回指定的用户数据

    * req.getParameterValues("键名");//返回同键不同值的请求数据(多选),返回的数组。

    * req.getParameterNames()//返回所有用户请求数据的枚举集合

  * 注意:

    * 如果要获取的请求数据不存在,不会报错,返回null。

Response 对象

  服务器接收到信息处理后需要返回信息到客户端,所以的返回需要用到的操作也被封装到Response 对象中;

一些基本的使用方法:
   * 设置响应头
    *  resp. setHeader(String name,String value);//在响应头中添加响应信息,但是同键会覆盖
    *  resp. addHeader(String name,String value);//在响应头中添加响应信息,但是不会覆盖。
  * 设置响应状态
    *  resp. sendError(int num,String msg);//自定义响应状态码。
  * 设置响应实体
    *  resp.getWrite().write(String str);//响应具体的数据给浏览器
  * 设置响应编码格式:
    * resp.setContentType("text/html;charset=utf-8");
  * 总结:
    * service请求处理代码流程:
      * 设置响应编码格式(告诉客户端用什么编码解析,防止客户端乱码)
      * 获取请求数据
      * 处理请求数据
      * 数据库操作(MVC思想)
      * 响应处理结果

服务器获得的请求数据编码问题

  因为客户端采用的iso8859-1编码,所以发送的数据服务器接收后需要采用对应编码解析;一般服务器采用utf-8编码;

  1,使用 String 进行重新编码(但该方法需要对每个用到的属性编写解码代码,比较麻烦,不推荐)

    name=new String(name.getBytes("iso8859-1"),"utf-8");//先通过iso8859-1解码成二进制数组,再同utf-8编码成字符串

  2,Post方式请求:

    在 service 方法中使用: req.setCharacterEncoding(“utf-8”);

  3,get方式请求

    在 service 方法中使用: req.setCharacterEncoding(“utf-8”);在 tomcat 服务器目录下的 conf 文件下找到 server.xml 文件,打开进行如下配置:找到Connector标签加入useBodyEncodingForURI="true"属性;就是将<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> 变成 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true"/>

请求转发

  实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。(例如在淘宝上购物,到了付款的时候就会请求转发到支付宝进行付款)

  使用:
    * req.getRequestDispatcher("要转发的地址").forward(req, resp);
    * 地址:相对路径,直接书写servlet的别名即可。

      注意:forward就是将当前Servlet的Request对象和Response对象传给要处理的 Servlet,让下一个处理信息的Servlet可以继续拥有与这个客户端连接的信息。这就使得Request对象和Response对象的作用域为所有的请求转发的Servlet。
  * 特点:
    * 一次请求,浏览器地址栏信息不改变。
  * 注意:
    * 请求转发后直接return结束即可,请求转发后就直接交给下一个Servlet处理就好了。

重定向

  如果当前的请求,Servlet 无法进行处理怎么办?那就需要转到可以处理的页面(例如: 输入账号密码登录后,要进入主页面,可以登录Servlet没办法显示主页面,就需要转到可以显示主页面的Servlet)

  用请求转发也可以转到别的Servlet,但是请求转发是一次请求,浏览器地址栏信息不改变,浏览器刷新后还是会回到原来的页面,不是和完成这个功能;

  这时候就需要重定向了,通过重定向返回数据到浏览器后可以使得浏览器立刻再次发起一个我们指定的信息url请求;

  使用:

    * resp.sendRedirect(String uri);
   * 示例:
    * resp.sendRedirect("/login/main");

    *可以是相对路径或者绝对路径,注意:绝对路线只需要写web项目及以下的路径 例如:/login为项目路径 ,main为Servlet路径别名
  * 特点:
    * 两次请求,两个request对象。
    * 浏览器地址栏信息改变

原文地址:https://www.cnblogs.com/zdl2234/p/11280080.html