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>
使用注解:
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> <!--  表示空格--> <input type="submit" value ="点击登录"> <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路径访问时,先找动态资源,再找静态资源

浙公网安备 33010602011771号