Servlet总结(Zpoor,你还说你不会Servlet?)

在上周的S7英雄联盟总决赛中,因为Faker要急着回去吃饭,最终被SSG3:0,白天我还能忍得住,晚上就在被窝里悄悄的笑起来(哈哈哈。。。。自己脑补)。真得劲。

这周学了还算不少东西,但是缺点就是不写博客了,你说你想干啥?还有我发现学习编程还是要多看书,少看视屏,多思考,多写,多总结

我好饿啊。

Servlet通常被称为服务端小程序,是运行在服务器端的程序,用于处理和响应客户端的请求。
主要缺点就是开发效率低,表现层中,所有的HTML标签都要用输出流输出,非常麻烦。在MVC规范出来之后,Servlet作为控制器使用,不在作为视图层。

Servlet是一个特殊的Java类,必须继承HttpServlet。Servlet提供不同的方法用于响应客户端的请求。

doGet:用于响应客户端的GET请求
doPost:用于响应客户端的POST请求
doput:用于响应客户端的PUT请求
doDelete:用于响应客户端的DELETE请求

注意:
doGet和doPost最常用,一般响应请求就要重写上面四种方法,大部分时候,Servlet对于请求响应都是一样的,只需重写service方法即可响应客户端的所有请求。

init(ServletConfig config):创建Servlet实例,初始化Servlet资源
destroy:销毁Servlet,自动调用该方法回收资源(一般都是关闭停止服务器才会调用此方法)
注意:这两种方法无需重写

设置编码方式:
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

获取的请求参数:
        String name = request.getParameter("name");(单个参数)

获取复选框的参数:
        String[] color = request.getParameterValues("color");

获取页面的输出流
        PrintStream out = new PrintStream(response.getOutputStream());

Servlet和Jsp区别:
    Servlet没有内置对象,原本Jsp中的内置对象都要由程序显式创建
    对于静态的HTML标签,Servlet都要使用页面输出流逐个输出

从servlet3.0开始,配置Servlet有两种方式:
    @WebServlet注解进行配置
    web.xml文件配置

@WebServlet常用属性:
    asyncSupported    指定该Servlet是否支持一步操作模式
    displayName       指定Servlet的显示名
    initParams          为该Servlet配置参数
    loadOnStartup     该Servlet配置为load-on-startup的Servlet
    name              指定该Servlet的名称
    urlPatterns/value 两个属性的作用相同,指定该Servlet的处理URL

关于@WebServlet注解和Web.xml配置的注意事项:
    使用的注解的时候:
        不要再web.xml文件的根元素(<web-app...>)指定metadata-complete = "true"。
        不要再web.xml中配置该servlet。
    使用web.xml的时候:
        要配置Servlet的名字:对应web.xml文件中的<servlet/>元素。
        要配置Servlet的URL:对应web.xml文件中的<servlet-mapping/>,如果没有配置就不能响应用户的请求。


<servlet>
            <!-- 指定Servlet的名字 ,相当于指定@WebServlet的name属性 -->
      <servlet-name>firstServlet</servlet-name>
            <!-- 指定Servlet的实现类 -->
      <servlet-class>cn.zpoor.servlet.FirstServlet</servlet-class>
</servlet>



    <!-- 配置Servlet的Url -->
<servlet-mapping>
          <!-- 指定Servlet的名字 -->
      <servlet-name>firstServlet</servlet-name>
          <!-- 指定Servlet映射的Url地址 -->
      <url-pattern>/zpoor</url-pattern>
</servlet-mapping>


创建Servlet实例的两个时机:
    客户端第一次请求某个servlet,创建servlet实例(大部分都是这样创建的)
    Web应用启动时立即城建Servlet实例,即load-on-srtartup Servlet

Jsp/Servlet的生命周期:
    创建Servlet实例
    Web容器调用Servlet的init方法,初始化Servlet
    初始化之后,一直在容器内,接收什么请求,就响应什么请求;或者统一使用Service方法来处理用户请求
    Web容器决定销毁Servlet,先调用Servlet的destory方法,通常在关闭web应用之前销毁servlet
    

为Servlet配置参数的两种方式:
    @WebServlet的initParams属性来指定(name:指定参数名   value:指定参数值)
    web.xml文件的<servlet/>元素中添加<init-param/>子元素来指定(param-name:指定配置参数名  param-value:指定参数值)
    (访问Servlet配置参数通过ServletConfig对象完成,提供的方法Java.lang.String getInitParameter(java.lang.String name):获取初始化参数)(Jsp的内置对象config就是此处的ServletConfig)

ServletConfig获取配置参数的方法和ServletContext方法完全一样(前者获取当前的Servlet配置参数,后者获取整个web应用的配置参数)

    try {
                //获取ServletConfig对象
            ServletConfig config = getServletConfig();
                //通过ServletConfig对象获取配置参数
            String driver = config.getInitParameter("driver");
            String url = config.getInitParameter("url");
            String user = config.getInitParameter("user");
            String password = config.getInitParameter("password");
        } catch (Exception e) {
                e.printStackTrace();
            }

Servlet作为控制器(Controller):
    作为表现层的劣势:
        开发效率低,所有的html都需要页面输出流完成
        不利于团队协作开发,美工没法参与Servlet的开发
        程序的可维护性差,即使修改一个按钮,都要重新编写编译java代码

Jsp作为表现层(View)作用:
    负责收集用户的请求参数
    将应用的处理结果,状态数据呈现给用户

MVC对应组件:
    M:Model 模型 对应javabean
    V:View 视图  对应jsp页面
    C:Controller 控制器  对应Servlet

Servlet3.0新特性(革命版本):
    在javax.servlet.annotation提供如下注解:
        @WebServlet:修饰一个Servlet类,用于部署Servlet类
        @WebInitParam:为Servlet和Filter配置参数
        @WebFilter:修饰部署Filter类
        @MultipartConfig:修饰Servlet,指定该Servlet负责处理multipart/form-data类型的请求(用于文件上传)
    Web模块支持(web-fragment.xml配置知识)
    提供异步处理

Servlet3.1新特性:
    强制更改Session id
    非阻塞IO(什么阻塞IO,当Servlet读取浏览器提交的数据时,如果数据不可用或者数据没有读取完成,当前线程就会阻塞无法继续向下执行)
        底层IO实现原理(基于两个IO流)
            ServletInputStream:读取数据的输入流
            ServletOutputStream:输出数据的输出流
        



原文地址:https://www.cnblogs.com/zpoor/p/7800217.html