Servlet service applet

概念:运行在服务器端的小程序

  Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。

  将来我们自定义一个类,继承HttpServlet,复写doGet/doPost方法。

实现步骤:

  1.创建一个模块javaEE - Wed Application

  2.在模块 wed - WED-INF 下新建目录lib

  3.复制Tomcat中的架包:servlet-api.jar (Tomcat安装路径)到 wed - WED-INF - lib

  4.将 servlet-api.jar 文件 加入库 Add as Library 

  5.创建类实现SerVlet 或者 继承HttpServlet 重写service()方法

  6.配置web.xml

  7.在Tomcat中部署模块

实现代码:

  实现接口:Servlet
package com.qf.servlertest;

import javax.servlet.*;
import java.io.IOException;

//实现接口:Servlet,并重写接口中的方法
public class ServletTest1 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

  //重写service方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello worid");  //测试输出语句
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
    }
}
<?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-name>ServletTest1</servlet-name>

        <!-- 包名 + 类名 -->
        <servlet-class>com.qf.servlertest.ServletTest1</servlet-class>
    </servlet>

    <!-- 配置servlet映射的路径 -->
    <servlet-mapping>
        <servlet-name>ServletTest1</servlet-name>   
        <url-pattern>/ServletTest1</url-pattern>
    </servlet-mapping>

</web-app>
  继承类:HttpServlet
package com.qf.servlertest;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import java.io.IOException;

//继承HttpServlet类
public class ServletTest2 extends HttpServlet {
    
    //重写service方法
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("hello worid");  //测试输出语句
    }
}
<?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-name>ServletTest2</servlet-name>

        <!-- 包名 + 类名 -->
        <servlet-class>com.qf.servlertest.ServletTest2</servlet-class>
    </servlet>

    <!-- 配置servlet映射的路径 -->
    <servlet-mapping>
        <servlet-name>ServletTest2</servlet-name>
        <url-pattern>/ServletTest2</url-pattern>
    </servlet-mapping>

</web-app>
  使用注解:

Servlet3.0:好处,支持注解配置。可以不需要web.xml了。

package com.qf.servlertest;

import javax.jws.WebService;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.io.IOException;

//添加注释,不需要配置xml文件,可以直接调用
//@WebServlet("/访问路径名")
@WebServlet(urlPatterns = "/ServletTest3") public class ServletTest3 extends HttpServlet { //重写service()方法 @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("hello world"); } }
/*

  @Target({ElementType.TYPE})
  @Retention(RetentionPolicy.RUNTIME)
  @Documented
  public @interface WebServlet {
    String name() default "";//相当于<Servlet-name>

    String[] value() default {};//代表urlPatterns()属性配置
  
    String[] urlPatterns() default {};//相当于<url-pattern>

    int loadOnStartup() default -1;//相当于<load-on-startup>

    WebInitParam[] initParams() default {};

    boolean asyncSupported() default false;

    String smallIcon() default "";
  
    String largeIcon() default "";

    String description() default "";

    String displayName() default "";
  }

*/
  根据前端获取内容并判断
package com.qf.servlertest;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.io.IOException;

//使用注解
@WebServlet(urlPatterns = "/ServletTest4")
public class ServletTest4 extends HttpServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

        //获取前端输入
        String username =req.getParameter("username");
        String userpassword = req.getParameter("userpassword");

        //假设数据库中的账号密码为以下
        String name = "张三";
        String password = "123456";

        //判断密码是否匹配
        if(name.equals(username) && password.equals(userpassword)){
            System.out.println("登录成功");
        }else {
            System.out.println("账号或密码有误");
        }
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
    <!--提交地址为对应的类-->
    <form action="/ServletTest4">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="userpassword"><br>
        <!--&nbsp 表示空格-->
        <input type="submit" value ="点击登录"> &nbsp;&nbsp;&nbsp;&nbsp;
        <input type="reset" value = "点击重置">
    </form>
</body>
</html>
<!--在浏览器运行此文件,提交数据、判断结果在IDEA控制台查看-->

执行原理:

1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法

Servlet中的生命周期:

 servlet类对象什么时候创建,什么时候调用什么方法,什么时候销毁。
 Servlet程序的生命周期由tomcat服务器控制的。
  Servlet生命周期的方法在Servlet接口中实现。
  构造方法: 创建servlet对象的时候调用,默认情况下,第一次访问servlet的时候创建servlet对象 只调用1次。证明servlet对象在tomcat是单实例的。
  init方法: 创建完servlet对象的时候调用,只调用1次。
  service方法: 每次发出请求时调用,调用n次。
  destroy方法: 停止服务器或者重新部署web项目,销毁servlet对象的时候调用,只调用1次。

Servlet的自动加载

  默认情况下,第一次访问servlet的时候创建servlet对象,如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢,我们可以改变servlet创建对象的时机,在servlet的配置信息中,加上一个<load-on-startup>标签,将会自动创建Servler方法,创建时调用构造方法,穿件完成调用init()方法,<load-on-startup>这里写整数值,代表执行优先级,整数越大,优先级越低<load-on-startup>提前到加载web应用的时候创建!!!

Servlet的多线程并发问题

  注意: servlet对象在tomcat服务器是单实例多线程的。
  因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。

解决办法:

  1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)
  2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。

Servlet的体系结构

Servlet -- 接口
|
GenericServlet -- 抽象类
|
HttpServlet -- 抽象类

- GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
 - 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
- HttpServlet:对http协议的一种封装,简化操作
 1. 定义类继承HttpServlet
 2. 复写doGet/doPost方法

 Servlet相关配置

urlpartten:Servlet访问路径
 1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/xxx","/yyy","/zzz"})
 2. 路径定义规则:
  1. /xxx:路径匹配
  2. /xxx/xxx:多层路径,目录结构
  3. *.do:扩展名匹配
注意:url路径访问时,先找动态资源,再找静态资源

posted @ 2021-05-10 22:20  青草的骨头  阅读(59)  评论(0)    收藏  举报