一.重定向
二.访问路径
1.项目部署的过程
2.如何获取访问路径
- 项目名:getContextPath()
- Servlet访问路径:getServletPath()
- URI:getRequestURI()
- URL:getRequestURL()
3.URI和URL的区别
1)狭义的理解(Java WEB项目)
- URI:绝对路径
- URL:完整路径
2)广义的理解(任意WEB项目)
- URI:资源的名字
- URL:资源的真名
URI包含URL
4.如何配置Servlet访问路径?
1)精确匹配
- /hello
- 必须通过“/hello”才能访问此Servlet
- 此Servlet只能处理“/hello"这一个请求
2)通配符
- /*
- 通过任何路径都能访问此Servlet
- 此Servlet能处理一切请求
3)后缀
- *.abc
- 以.abc为后缀的请求都能访问此Servlet
- 此Servlet能够处理多个请求
5.如何使用一个Servlet处理多个请求?
四.Servlet生命周期
五.ServletConfig和ServletContext
1.它们的作用
- 都能够读取web.xml中为Servlet预置的参数
2.它们的区别
- config和Servlet是1对1的关系
- context和Servlet是1对多的关系
- 若数据只给某个Servlet使用,则用config
- 若数据给多个Servlet使用,则用context
它们的关系由服务器来保障
3.config使用场景
- 假设要开发一个网页游戏,若超过人数上限则要排队
- 开发登陆功能LoginServlet
- 人数上限应该是一个可配置的参数maxOnline
- 该参数由LoginServlet使用
由于该参数只是LoginServlet是哟个由config读取即可
扫描二维码关注公众号,回复:
3265160 查看本文章
4.context使用场景
- 大部分的查询都具备分页功能
- 分页需要一个参数,每页显示几条数据size
- 该参数一般可配置,由于被众多查询功能复用,使用context读取
5.context可以存取变量
六.Servlet线程安全问题
package web;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//Tomcat创建Servlet的过程:
//LoginServlet ls = new LoginServlet();
//ServletConfig cfg = new ServletConfig();
//ls.init(cfg);
//ls.service();
ServletConfig cfg = getServletConfig();
String maxOnline = cfg.getInitParameter("maxOnline");
System.out.println(maxOnline);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>servlet4</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>web.DemoServlet</servlet-class>
<!-- 在启动服务器时第一个创建此Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>web.LoginServlet</servlet-class>
<init-param>
<param-name>maxOnline</param-name>
<param-value>3000</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
EmpManager
package dao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import entity.Emp;
public class EmpDao implements Serializable {
public List<Emp> findAll(){
//模拟查询所有的员工
List<Emp> list = new ArrayList<Emp>();
Emp e1 = new Emp();
e1.setEmpno(1);
e1.setEname("唐僧");
e1.setJob("领导");
e1.setSal(9000.0);
list.add(e1);
Emp e2 = new Emp();
e2.setEmpno(2);
e2.setEname("悟空");
e2.setJob("职员");
e2.setSal(5000.0);
list.add(e2);
Emp e3= new Emp();
e3.setEmpno(3);
e3.setEname("八戒");
e3.setJob("职员");
e3.setSal(6000.0);
list.add(e3);
return list;
}
public void save(Emp e){
System.out.println("增加员工:"+e.getEname());
}
}
package entity;
import java.io.Serializable;
public class Emp implements Serializable {
private Integer empno;
private String ename;
private String job;
private Double sal;
public Integer getEmpno() {
return empno;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.EmpDao;
import entity.Emp;
/**
* 开发规范:
* 查询员工:/find.emp
* 增加员工:/add.emp
* @author Administrator
*
*/
public class EmpServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//判断访问路径并处理请求
String path = req.getServletPath();
if("/find.emp".equals(path)){
findEmp(req,res);
}else if("/add.emp".equals(path)){
addEmp(req,res);
}else{
throw new RuntimeException("查无此页");
}
}
protected void findEmp(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//1.接收参数
//2.处理业务
EmpDao dao = new EmpDao();
List<Emp> list = dao.findAll();
//3.发送响应
res.setContentType("text/html;charset=utf-8");
PrintWriter w = res.getWriter();
//当前:/EmpManager/findEmp
//目标:/EmpManager/add_emp.html
w.println("<a href='add_emp.html'>增加</a>");
w.println("<table border='1' cellspacing='0' width='30%'>");
w.println(" <tr>");
w.println(" <td>编号</td>");
w.println(" <td>姓名</td>");
w.println(" <td>职位</td>");
w.println(" <td>薪资</td>");
w.println(" </tr>");
if(list!=null){
for(Emp e:list){
w.println("<tr>");
w.println(" <td>"+e.getEmpno()+"</td>");
w.println(" <td>"+e.getEname()+"</td>");
w.println(" <td>"+e.getJob()+"</td>");
w.println(" <td>"+e.getSal()+"</td>");
w.println("</tr>");
}
}
w.println("</table>");
w.close();
}
protected void addEmp(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//1.接受参数
req.setCharacterEncoding("utf-8");
String ename = req.getParameter("ename");
String job = req.getParameter("job");
String sal = req.getParameter("sal");
//保存员工数据
Emp e = new Emp();
e.setEname(ename);
e.setJob(job);
e.setSal(Double.valueOf(sal));
new EmpDao().save(e);
//3.发送响应
// res.setContentType("text/html);charset=utf-8");
// PrintWriter w = res.getWriter();
// w.println("<p>保存成功</p>");
// w.close();
//重定向到查询页面,即建议浏览器自己去访问查询页面。
//当前:/EmpManager/addEmp
//目标:/EmpManager/findEmp
res.sendRedirect("find.emp");
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>增加员工</title>
</head>
<body>
<!-- 当前:/EmpManager/add_emp.html
目标:/EmpManager/add.emp
-->
<form action="add.emp" method="post">
<p>
姓名:<input type="text" name="ename"/>
</p>
<p>
职位:<input type="text" name="job"/>
</p>
<p>
薪资:<input type="text" name="sal"/>
</p>
<p>
<input type="submit" value="保存"/>
</p>
</form>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>EmpManager</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- <servlet>
<servlet-name>findEmp</servlet-name>
<servlet-class>web.FindEmpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>findEmp</servlet-name>
<url-pattern>/findEmp</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>addEmp</servlet-name>
<servlet-class>web.AddEmpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addEmp</servlet-name>
<url-pattern>/addEmp</url-pattern>
</servlet-mapping> -->
<servlet>
<servlet-name>emp</servlet-name>
<servlet-class>web.EmpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>emp</servlet-name>
<url-pattern>*.emp</url-pattern>
</servlet-mapping>
</web-app>
Servlet1
package web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//获取访问路径
System.out.println(req.getContextPath());
System.out.println(req.getServletPath());
System.out.println(req.getRequestURI());
System.out.println(req.getRequestURL());
/*
* 本案例主要演示获取访问路径的方式,就不向浏览器输出内容了。但服务器会自动的向
* 浏览器做出响应,只是内容为空而已,浏览器看到一片空白。
*/
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>servlet3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>web.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<!-- 1.精确匹配 -->
<!-- <url-pattern>/hello</url-pattern> -->
<!-- 2.通配符 -->
<!-- <url-pattern>/*</url-pattern> -->
<!-- 后缀 -->
<url-pattern>*.abc</url-pattern>
</servlet-mapping>
</web-app>
Servlet2
package web;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DemoServlet extends HttpServlet {
public DemoServlet(){
System.out.println("实例化DemoServlet");
}
@Override
public void destroy() {
super.destroy();
System.out.println("销毁DemoServlet");
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("初始化DemoServlet");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
System.out.println("调用DemoServlet");
}
}
package web;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//Tomcat创建Servlet的过程:
//LoginServlet ls = new LoginServlet();
//ServletConfig cfg = new ServletConfig();
//ls.init(cfg);
//ls.service();
ServletConfig cfg = getServletConfig();
String maxOnline = cfg.getInitParameter("maxOnline");
System.out.println(maxOnline);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>servlet4</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>web.DemoServlet</servlet-class>
<!-- 在启动服务器时第一个创建此Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>web.LoginServlet</servlet-class>
<init-param>
<param-name>maxOnline</param-name>
<param-value>3000</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
Sertlet3
package web;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FindDeptServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
ServletContext ctx = getServletContext();
String size = ctx.getInitParameter("size");
System.out.println(size);
Integer count = (Integer)ctx.getAttribute("count");
ctx.setAttribute("count", ++count);
System.out.println(count);
}
}
package web;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FindEmpServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
ServletContext ctx = getServletContext();
String size = ctx.getInitParameter("size");
System.out.println(size);
//统计流量
Integer count = (Integer)ctx.getAttribute("count");
ctx.setAttribute("count", ++count);
System.out.println(count);
}
}
package web;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
/**
* 此类仅仅是在服务器启动时初始化参数的,不负责处理任何具体的请求。
* @author Administrator
*
*/
public class InitServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
ServletContext ctx = getServletContext();
ctx.setAttribute("count", 0);
}
}
package web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UpServlet extends HttpServlet {
private Double salary = 2000.0;
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
synchronized(this){
salary += 100.0;
try{
//模拟网络延迟
Thread.sleep(8000);
}catch(InterruptedException e){
e.printStackTrace();
}
res.setContentType("text/html");
PrintWriter w = res.getWriter();
w.print(salary);
w.close();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>servlet4</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>web.DemoServlet</servlet-class>
<!-- 在启动服务器时第一个创建此Servlet -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>web.LoginServlet</servlet-class>
<init-param>
<param-name>maxOnline</param-name>
<param-value>3000</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>findDept</servlet-name>
<servlet-class>web.FindDeptServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>findDept</servlet-name>
<url-pattern>/findDept</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>findEmp</servlet-name>
<servlet-class>web.FindEmpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>findEmp</servlet-name>
<url-pattern>/findEmp</url-pattern>
</servlet-mapping>
<!-- Tomcat启动时会给每个项目创建一个context对象,并自动调用此对象加载对应项目的web.xml中的参数 -->
<context-param>
<param-name>size</param-name>
<param-value>10</param-value>
</context-param>
<servlet>
<servlet-name>init</servlet-name>
<servlet-class>web.InitServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>up</servlet-name>
<servlet-class>web.UpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>up</servlet-name>
<url-pattern>/up</url-pattern>
</servlet-mapping>
</web-app>