servlet

servlet概述

Servlet是Server Applet的简称,意思为用Java编写的服务器端的程序. 它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用Servlet方法。

servlet的作用:

  • 接收(浏览器)用户发送的请求数据
  • 调用java程序来处理请求
  • 根据处理结果,将结果响应给客户端

servlet创建和使用

1.创建一个类继承javax.servlet.http包下的HttpServlet

public class LoginServlet_back extends HttpServlet {

  public LoginServlet_back(){
      System.out.println("LoginServlet无参构造");
    }

    /*
       在构造方法执行完成后立即执行,
       用来初始化servlet,有一个ServletConfig的参数,封装servlet配置信息的
    */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init:"+config.getInitParameter("n"));
    }

    /*
       service 为前端提供服务的,每次请求都会被访问
       HttpServletRequest  表示请求,封装请求数据
       HttpServletResponse  表示响应

       jdbc 接口  mysql实现
       tomcat运行java 接口  tomcat实现
    */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(req);
        System.out.println(resp);
        System.out.println("service");
    }

    /*
    在服务器关闭时,让我们的servlet程序可以去执行某些最终的操作(例如,最中将一些数据存储到数据库,打印日志)
    */
    @Override
    public void destroy() {
        System.out.println("destroy");
    }


}

2.web.xml文件中配置Servlet

web.xml: 存储我们自己项目的配置文件,在服务器启动时,由服务器加载读取配置servlet,过滤器,监听器…

<servlet>
    <servlet-name>servlet名</servlet-name>
    <servlet-class>servlet类地址</servlet-class>
    
</servlet>
<servlet-mapping>
    <serlvet-name>servlet名</serlvet-name>
    <url-pattern>servlet访问路径</url-pattern>
     <!--servlet什么时候被创建  小于0-第一次访问时,大于等于0在服务器启动时-->
     <load-on-startup>-1</load-on-startup>
   
</servlet-mapping>

3.运行servlet程序

通过浏览器访问http:127.0.0.1:8080/项目名/url

servlet的生命周期

构造方法:最先执行只被调用一次,只有第一次访问Servelt时或服务器启动时创建Servlet实例。

Init方法:只被调用一次,在Servlet实例创建好实例后立即执行,用于执行一些初始化Servlet的操作。

service方法:多次调用,每次请求都调用service方法,根据请求方式调用doGet()或doPost()方法。

destroy:只被调用一次,在服务器关闭时调用,执行一些操作。

创建实例->初始化->服务->消亡

一次http请求发送到后端找到Servlet程序,是按照一个特定顺序调用方法的,在哪儿规定的调用顺序,在最上层定义一

个Servlet接口(init,service,destroy),所有的javaEE(实现了Servlet接口的类)都会按照这个规范来执行.

http协议

超文本传输协议 (HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议,是互联网上应用最为流行的一种网络协议,用于定义客户端浏览器和服务器之间交换数据的过程。

HTTP是一个基于TCP/IP通信协议来传递数据.

http请求

http请求包括:

请求行:包含http请求方式,请求资源名称,http版本 .

请求头:包含主机地址,以及客户端的一些环境信息,以键值对的形式向后端传递.

请求体 :代表着浏览器在post请求方式中传递给服务器的参数,请求体中参数以键值形式传递,多个用&链接,服务器接收到后再解析

http的两种请求方式:

get:点击超链接,表单 method=“get”,直接在地址栏中输入地址

post:表单 method=“post”

区别:

get:主要用于从服务器获取数据,也是可以向服务器发送数据的,通过URL提交数据,数据在URL中可以看到,提交的数据大小受限制一般1kb.

post:主要是向服务器提交信息,数据放置在请求体中提交,不会显示在地址栏中相对安全,传输的数据量大,没有限制(可以通过post提交文件)

后端处理

由于前端发送的http请求有get和post两种,所以后端提供doGet()和doPost()进行对应的处理.虽然调用doget和

dopost方法,但是构造,init,service,destroy方法,仍然会正常执行. 当我们servlet中没有需要初始化的内容时,可以

不重写init(),但是服务器会依然调用父类中重写的init() 父类中已经重写了service(),并且根据请求方式进行了判

断,get–>doGet(),post–>doPost() 当我们servlet中没有需要最终执行的操作时,可以不重写destroy(),但是服务器

会依然调用父类中重写的destroy() 当一次http请求发送到服务器时,tomcat会将请求中所有的数据,都封装到一个

实现HttpServletRequest类的对象中. 使用此对象,就可以获取所有的请求数据.

   @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收请求数据(请求行,请求头)也可以在dopost方法中使用
        System.out.println(req.getRequestURL());
        System.out.println(req.getMethod());
        System.out.println(req.getScheme());
        System.out.println(req.getProtocol());
        System.out.println(req.getRemoteAddr());//获得远端的ip和端口
        System.out.println(req.getRemotePort());//客户端端口
        System.out.println(req.getServerName());
        System.out.println(req.getServerPort());
        System.out.println(req.getHeader("User-Agent"));
        //请求数据中,自己传递的
        System.out.println(req.getParameter("name"));
        System.out.println(req.getParameter("age"));
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /post数据在接收之前,需要设置一个解码规则
        req.setCharacterEncoding("utf-8");
          System.out.println(req.getParameter("account"));
        System.out.println(req.getParameter("password"));
        String []  hobbys = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbys));
        //响应
       // resp.setContentType("text/html;charset=utf-8");
        resp.setHeader("Content-Type", "text/html;charset=utf-8");//设置响应数据编码,在获得流对象之前设置
        PrintWriter printWriter =  resp.getWriter();
        printWriter.print("提交成功"); //对象,集合,map-->json
    }

过滤器

Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Servlet, 从而实现一些 特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

作用:对服务器web资源进行拦截(权限控制,通过拦截资源进行权限控制,是否可以访问)

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截

Servlet API 中,与过滤器有关的API共有三个接口,分别是 Filter 、FilterChain 、FilterConfig

过滤器的创建

1.创建一个类实现

public class EncodFilter implements Filter {


    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              
              servletRequest.setCharacterEncoding("utf-8");
      //filterChain过滤链,  处理完后,让请求继续向下执行,下一个可能是目标servlet,也可能是下一个过滤器
             filterChain.doFilter(servletRequest,servletResponse);
    }

}

doFilter方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法。方法体中可以对

request 和response进行预处理。其中FilterChain可以将处理后的request 和response对象传递到过滤链上的下

一个资源。

2.在 web.xml中配置过滤器

   <filter>    
       <filter-name>encod</filter-name>    
       <filter-class>com.ffyc.webback.filter.EncodFilter</filter-class>
   </filter>
   <filter-mapping>    
          <filter-name>encod</filter-name>   
           <url-pattern>/*</url-pattern><!--配置哪些请求地址进入到编码过滤器-->
   </filter-mapping>

过滤器用来实现通用的功能,减少代码冗余,提高可维护性 ,一个过滤器可以配置给多个资源使用 ,一个资源也可以配置多个过滤器,按照配置顺序调用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序J

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值