Servlet

目录

一、什么是Servlet

二、Servlet本质

三、使用步骤:xml配置方式

四、Servlet执行流程

五、Servlet的体系结构

六、Setvlet生命周期

七、get提交与post提交

八、Servlet的注解方式有哪些常用属性


一、什么是Servlet

server Applet (Java连接器),针对服务端的程序的开发(服务端的连接器)
java语言编写的服务端程序,(controller控制器),能够前台页面进行交互的浏览器和生成数据,产生web内容。

二、Servlet本质

servlet   狭义的规范:接口,实现Servlet接口的普通类
          广义的规范:自定义一个类继承自Servlet接口的抽象类HttpServlet

三、使用步骤:xml配置方式

1)导入servlet - api.jar包,(ee规范的:HttpServlet/Servet接口) /jsp-api.jar(支持jsp格式)
2)在src下创建一个类  MyServlet,继承HttpServllet (javax.servlet.http.HttpServlet)
重写doGet和doPost方法
doGet()---->接收get提交(用户直接在浏览器地址栏默认都是 get)
doPost()--->接收post提交
3)编写后台的业务处理doGet()....
    调用service层-----进行业务功能实现
            调用dao层:完成jdbc操作
3)重写HttpServlet的doGet():执行前台get请求的提交/doPost()方法,执行前台post提交
4)需要在当前web工程WEB-INF的web.xml文件配置servlet
                <!--servlet的基本配置-->
               <servlet>
                   <!--servlet的名称-->
                   <servlet-name>MyServlet</servlet-name>
                   <servlet-class>com.qf.servlet_01.MyServlet</servlet-class>
               </servlet>
               
               <!--servlet的映射配置 访问的请求路径-->
               <servlet-mapping>
                   <servlet-name>MyServlet</servlet-name>
                   <!--映射路径必须以"/指定的路径"-->
                    <url-pattern>/myFirst</url-pattern>
                </servlet-mapping>
5)访问路径  http://localhost:8080/Web_02/myFirst     -- URL(URL 属于URI子集)
            /Web_02/myFirst                         -- URI

四、Servlet执行流程

1)Web客户端向服务器发送请求  http://loclhost:8080/web工程名称/hello
2)服务器接收请求,解析访问路径uri:  /web工程/hello
    找当前web工程是否存在url-pattern为"/hello",web.xml去查找
3)如果找不到,404---->找不到路径
如果找到了,解析servlet-mapping  获取url-pattern对应的servlt-name
在通过servlt-name找servlet的基本配置里面servlet-class : 当前servlet的全限定名称:包名.类名
4)反射的方式Class.forName("包名.类名")--->Class clazz
5)创建当前类实例----clazz.newIntance()---->Object obj
6)获取当前字节码文件对象中Method类对象
    Method method = clazz.getDeclaredMethod("doGet()",HttpServletRequest.class,HttpServletResponse.class) ;
7)调用方法
method.setAccessiable(true) ;
method.invoke(obj,request,response) ;

浏览器做的事

1)启动tomcat
2)浏览器发送请求到服务器  HttpServletRequest

服务器做的事

1)tomcat解析请求的路径的URI地址
2)进入到web工程WEB-INF的web.xml文件(tomcat解析xml文件)是否存在
            <url-pattern>/myFirst</url-pattern>
3)如果存在,找到了,就获取当前映射路径中对应的<servlet-name>MyServlet</servlet-name>
4)通过映射配置获取对应的servlet配置
        <servlet-name>MyServlet</servlet-name>
       <servlet-class>com.qf.servlet_01.MyServlet</servlet-class>
5)解析servlet-class  ---->com.qf.servlet01.MyServlet
6)反射
    Class  class = Class.forName(“com.qf.servlet01.MyServlet”);
7)创建当前实例
    clazz.newInstance()--->Object  obj
8)获取Method类对象
    Method method = clazz.getDeclaredMethod("doGet",HttpServletRequest.class,HttpServletResponse.class);
9)调用方法
    method.invoke(obj,response);
10)对浏览器进行相应HttpServeltResponse

1、创建MyServlet类,全限定名称 com.qf.servlet_01.MyServlet

public class MyServlet extends HttpServlet{
        @Override
    //Http协议:在请求的时候就创建了,服务器响应的时候就创建了
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
​
        //1)访问servlet---给tomcat发送请求
        //2)tomcat需要给浏览器进行响:将响应数据封装到HttpServletResponse 响应对象解决响应的中文乱码
        //void setContentType(String var1);
        
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("hello,这是我第一个Servlet");
    }
    //执行post提交
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)                 throws ServletException, IOException {
​
            doGet(req,resp);
    }
}

2、WEB-INF/web.xml的基本配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
​
​
    <!--servlet的基本配置-->
    <servlet>
        <!--servlet的名称  当前类名 -->
        <servlet-name>MyServlet</servlet-name>
        <!-- 指定当前servlet的全限定名称 -->
        <servlet-class>com.qf.servlet_01.MyServlet</servlet-class>
    </servlet>
​
    <!--servlet的映射配置 访问的请求路径-->
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <!--映射路径必须以"/指定的路径"-->
        <url-pattern>/myFirst</url-pattern>
    </servlet-mapping>
</web-app>

五、Servlet的体系结构

Servlet接口
public void service(ServletRequest req, ServletResponse res) 
抽象的GenericServlet   子实现类   Servlet方法没有被重写
public void service(ServletRequest req, ServletResponse res) 
抽象的HttpServlt类 ,子实现类
                    servlet方法被重写,获取了请求方式String nothod    doGet()/doPost();
public void service(ServletRequest req, ServletResponse res) {
            //获取前提的提交方式
            //public String getMethod()
            String method = req.getMethod() ;
            //选择结构语句判断
            if(method.equals("GET")){
                    ..
                    doGet(req,res) ;
            
            }else if(method.equals("POST")){
                    doPost(req,res) ;           
            }
}
​
xxxServlet继承自HttpServlet
    doGet()/doPost()
    
Myservlet:自定义类---具体类

六、Setvlet生命周期

1、生命周期

    public void init(ServletConfig config) throws ServletException :初始化 web容器对当前servlet进行数据初始化
    public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException  :业务调用方法(web客户端发送请求,web容器(tomcat)调用这个方法解析请求)
​
    public void destroy():servlet销毁,当前web容器(tomcat)正常关闭或者服务器(Linux:安装tomcat)停止了都会造成销毁

2、Servlet的是一个单例的,线程不安全

当前我们定义的servlet就被创建一次,初始化也是一次
service方法是业务方法方法,不断被调用,因为我们使用具体的get提交还是post提交,覆盖的应该具体的doXXX()方法

3、简单代码

public class ServletLife extends HttpServlet {
    /**
     * 提供无参构造方法
     */
    public ServletLife(){
        System.out.println("servletLife对象被创建了...");
    }
​
    @Override
    public void init(ServletConfig config) throws ServletException {
        //ServletConfig:接口  servlet的配置对象:每一个servlet都会自己的配置对象:
        // 获取servlet名称以及当前servlet的初始化参数
        System.out.println("servletLife初始化了...");
    }
    
    //servlet入口:业务方法服务方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("程序的入口service方法被调用了...");
    }
    
    //servlet销毁
    @Override
    public void destroy() {
        System.out.println("当前servlet被销毁了...");
    }
​
}

七、get提交与post提交

1、区别

1)get提交与post提交后台接数据相同,所以后台在doPost将doGet()复用(get提交方式居多)或者是在doGet()/复用doPost
2)get提交tomcat8.0不会出现中文乱码(优化了)
  post提交tomcat8.0必须解决中文乱码

2、调用到的方法

//HttpServletRequest接口
String getParameter(String var1);接收前台提交过来的参数 (在doPost通用)  通过参数名称获取参数值
Enumeration<String> getParameterNames(); 获取所有的参数名称
    前提要求:必须在页面上指定name属性的属性值:给后台标记内容

3、基本实现步骤

public class GetArgsServlet extends HttpServlet {
​
​
    //doGet:接收get提交参数
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
//或        
        //一次获取单个参数
        String username = request.getParameter("username");
        System.out.println("username:"+username);
        String password = request.getParameter("password");
        System.out.println("password:"+password);
        String email = request.getParameter("email");
        System.out.println("email:"+email);
//主
       //Enumeration<String> getParameterNames();   枚举方法
        Enumeration<String> enums = request.getParameterNames();
        while(enums.hasMoreElements()){
            //获取下一个元素
            String parameterName = enums.nextElement();
            //在通过参数名称获取参数值
            String value = request.getParameter(parameterName);
            System.out.println(parameterName+"----"+value);
        }
​
​
    }
​
    //接收post提交
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
​
        //将doGet()复用
        doGet(request,response);
//或
       //一次获取单个参数
        //String getParameter(String var1);接收前台提交过来的参数
         String username = request.getParameter("username");
        System.out.println("username:"+username);
        String password = request.getParameter("password");
        System.out.println("password:"+password);
        String email = request.getParameter("email");
        System.out.println("email:"+email);
​
         // Enumeration<String> getParameterNames();
        Enumeration<String> enums = request.getParameterNames();
        while(enums.hasMoreElements()){
            //获取下一个元素
            String parameterName = enums.nextElement();
            //在通过参数名称获取参数值
            String value = request.getParameter(parameterName);
            System.out.println(parameterName+"----"+value);
        }
    }
}

4、解决乱码问题

doPost()必须解决前提提交的中文乱码
doget()不需要解决中文乱码,tomcat8.0以后优化了

基本实现步骤

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
/*
*   doPost()必须解决前提提交的中文乱码
*   doget()不需要解决中文乱码,tomcat8.0以后优化了
* */
public class ServletResolveEncoding extends HttpServlet {
​
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //解决post提交乱码
        request.setCharacterEncoding("utf-8");
        //解决响应给浏览器的中文乱码
        response.setContentType("text/html;charset=utf-8");
        
        //获取前提提交参数:中文格式
        //获取用户名
        String username = request.getParameter("username");
        System.out.println("username:"+username);
    }
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
​
        //HttpServletReuqest它的父接口中有就这个方法
        //void setCharacterEncoding(String var1) throws UnsupportedEncodingException;
        /* request.setCharacterEncoding("utf-8");*/
​
       //获取前提提交参数:中文格式
//或       //获取用户名
        String username = request.getParameter("username");
        System.out.println("username:"+username);
​
       doGet(request,response);
​
    }
}
 

八、Servlet的注解方式有哪些常用属性

@WebServlet(urlpatterns={"/xxx"},name="当前Servlet名称")
    String[] value() ; //配置映射路径 如果只是书写这一个属性,而且名称就是value(value="/xx"),value可以省略("/xx")
    String[] urlPatterns(); //配置多个映射路径,如果只是配置一个映射路径 (urlpatterns={"/xxx"})
    String loadOnstratUp(); 配置Servlet的初始化数据 (1:优先级最大)
    String name():指定当前servlet名称,也可以省略(默认就是当前类名)
    WebInitParam[] initParams():配置当前servlet的初始化参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彦登的登

动力来源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值