一.重定向
- 项目名:getContextPath()
- Servlet访问路径:getServletPath()
- URI:getRequestURI()
- URL:getRequestURL()
- URI:绝对路径
- URL:完整路径
- URI:资源的名字
- URL:资源的真名
URI包含URL
4.如何配置Servlet访问路径? 1)精确匹配- /hello
- 必须通过“/hello”才能访问此Servlet
- 此Servlet只能处理“/hello"这一个请求
- /*
- 通过任何路径都能访问此Servlet
- 此Servlet能处理一切请求
- *.abc
- 以.abc为后缀的请求都能访问此Servlet
- 此Servlet能够处理多个请求
四.Servlet生命周期
- 都能够读取web.xml中为Servlet预置的参数
- config和Servlet是1对1的关系
- context和Servlet是1对多的关系
- 若数据只给某个Servlet使用,则用config
- 若数据给多个Servlet使用,则用context
它们的关系由服务器来保障
3.config使用场景- 假设要开发一个网页游戏,若超过人数上限则要排队
- 开发登陆功能LoginServlet
- 人数上限应该是一个可配置的参数maxOnline
- 该参数由LoginServlet使用
由于该参数只是LoginServlet是哟个由config读取即可
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);
}
}
servlet4
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
demo
web.DemoServlet
1
demo
/demo
login
web.LoginServlet
maxOnline
3000
login
/login
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 findAll(){
//模拟查询所有的员工
List list = new ArrayList();
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 list = dao.findAll();
//3.发送响应
res.setContentType("text/html;charset=utf-8");
PrintWriter w = res.getWriter();
//当前:/EmpManager/findEmp
//目标:/EmpManager/add_emp.html
w.println("增加");
w.println("");
w.println(" ");
w.println(" 编号");
w.println(" 姓名");
w.println(" 职位");
w.println(" 薪资");
w.println(" ");
if(list!=null){
for(Emp e:list){
w.println("");
w.println(" "+e.getEmpno()+"");
w.println(" "+e.getEname()+"");
w.println(" "+e.getJob()+"");
w.println(" "+e.getSal()+"");
w.println("");
}
}
w.println("");
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("保存成功
");
// w.close();
//重定向到查询页面,即建议浏览器自己去访问查询页面。
//当前:/EmpManager/addEmp
//目标:/EmpManager/findEmp
res.sendRedirect("find.emp");
}
}
增加员工
姓名:
职位:
薪资:
EmpManager
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
emp
web.EmpServlet
emp
*.emp
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());
/*
* 本案例主要演示获取访问路径的方式,就不向浏览器输出内容了。但服务器会自动的向
* 浏览器做出响应,只是内容为空而已,浏览器看到一片空白。
*/
}
}
servlet3
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
hello
web.HelloServlet
hello
*.abc
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);
}
}
servlet4
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
demo
web.DemoServlet
1
demo
/demo
login
web.LoginServlet
maxOnline
3000
login
/login
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();
}
}
}
servlet4
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
demo
web.DemoServlet
2
demo
/demo
login
web.LoginServlet
maxOnline
3000
login
/login
findDept
web.FindDeptServlet
findDept
/findDept
findEmp
web.FindEmpServlet
findEmp
/findEmp
size
10
init
web.InitServlet
up
web.UpServlet
up
/up