Servlet学习笔记(三)

一.重定向

二.访问路径

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>

猜你喜欢

转载自blog.csdn.net/qq_38826019/article/details/82663165
今日推荐