Servlet 笔记记录
一、Servlet
1.Servlet的介绍
2.Servlet动态资源案例
2.1 实现Servlet接口
import javax.servlet.*;
import java.io.IOException;
/**
* Servlet 入门程序
**/
public class StudentServlet 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("This is My 第一个servlet入门案例");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
控制台:页面请求就会调用service方法
2.2 继承GenericServlet类
import javax.servlet.*;
import java.io.IOException;
/**
* Servlet 入门程序
**/
public class StudentServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("service() running");
}
}
web.xml配置与上述相同
2.3 继承HttpServlet类
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Servlet 入门程序
**/
public class StudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet running");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.Servlet执行过程
4.Servlet关系视图
5.Servlet生命周期
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class StudentServlet extends HttpServlet {
/**
* 对象创建的过程,对象只创建一次
**/
@Override
public void init() throws ServletException {
System.out.println("对象创建并初始化成功");
}
/**
* 对象服务的过程
**/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("接收到了客户端请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
/**
* 对象销毁的过程
**/
@Override
public void destroy() {
System.out.println("对象销毁了");
}
}
6.Servlet线程安全(线程不安全)
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 线程安全测试
**/
public class StudentServlet extends HttpServlet {
//1. 定义一个用户成员变量
private String username;
@Override
public void init() throws ServletException {
System.out.println("对象创建并初始化成功");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决线程安全问题,1.第一种将成员变量变为局部变量,
//String username=null;
//2.同步代码块synchronized()
synchronized (this) {
//2.获取用户名
username = req.getParameter("username");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//3.将用户名响应给浏览器
PrintWriter pw = resp.getWriter();
pw.println("welcome" + username);
pw.close();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
/**
* 对象销毁的过程
**/
@Override
public void destroy() {
System.out.println("对象销毁了");
}
}
7.Servlet不同的映射方式
7.1 指定具体名称
7.2 /开头 +通配符的方式
成功:
7.3 通配符+固定格式结尾的方式
成功:
8.Servlet多路径映射
使用场景:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 多路径映射
*/
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.定义商品金额
int money=1000;
//2.获取访问资源路径
String path = req.getRequestURI();
path = path.substring(path.lastIndexOf("/"));
//3.条件判断
if ("/vip".equals(path)){
System.out.println("商品原价为"+money+"优惠后价格:"+(money*0.9));
}else if ("/vvip".equals(path)){
System.out.println("商品原价为"+money+"优惠后价格:"+(money*0.5));
}else {
System.out.println("商品价格为"+money);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
结果:
9.Servlet创建时机
当为加载时创建时,不访问但是对象已经创建成功