组件:满足规范的对象
术语:处理HTTP协议
建议修改为8088/8089,修改后重启tomcat才生效
package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TimeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
//1.使用request接收请求数据
//1)请求行(3)
System.out.println("协议类型:"+req.getProtocol());
System.out.println("访问路径:"+req.getServletPath());
System.out.println("请求方式:"+req.getMethod());
//2)消息头(键值对)
//该数据是按照键值对的方式存储的
//Enumeration是一个古老的迭代器,
//其用法和Iterator相似.
Enumeration<String> e = req.getHeaderNames();
while(e.hasMoreElements()) {
String key = e.nextElement();
String value = req.getHeader(key);
System.out.println(key + ":" + value);
}
//3)实体内容
//本案例没有传递具体的业务数据
//2.使用response发送响应数据
//1)状态行
//该数据由服务器自动填充
//2)消息头
//消息头中的大部分数据由服务器填充,但返回的内容格式需要程序员指定
//告诉浏览器向它发送的是什么类型的内容
res.setContentType("text/html");
//获取输出流,该流指向的目标是浏览器
PrintWriter pw = res.getWriter();
//获取服务器的时间
//将时间拼到一个网页里给浏览器返回
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String now = sdf.format(date);
//3)实体内容
//我们输出的网页就是实体内容
//此处偷懒,拼一个简化版的网页
pw.println(""
+ now + "");
//关闭输出流
pw.close();
}
}
<servlet>
<servlet-name>timeservlet-name>
<servlet-class>web.TimeServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>timeservlet-name>
<url-pattern>/tsurl-pattern>
servlet-mapping>
一次请求一次链接,降低服务器的压力
要求开发者会使用request和response就行了
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 RegServlet extends HttpServlet {
@Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//采用方案三解决POST请求乱码问题(在接受数据之前)
req.setCharacterEncoding("utf-8");
//处理请求的一般流程
//1.接收参数
String name = req.getParameter("userName");
String pwd = req.getParameter("pwd");
String sex = req.getParameter("sex");
String[] interests = req.getParameterValues("interest");
//采用方案一解决乱码问题
//byte[] bs = name.getBytes("iso8859-1");
//name = new String(bs,"utf-8");
//2.处理业务
//常规的注册业务应该保存这些数据,此处就输出下
System.out.println(name);
System.out.println(pwd);
System.out.println(sex);
if(interests != null) {
for(String interest : interests) {
System.out.println(interest);
}
}
//3.发送响应
res.setContentType("text/html;charset=utf-8");
PrintWriter w = res.getWriter();
w.println("ok,"
+name+"");
w.close();
}
}
<html>
<head>
<meta charset="UTF-8">
<title>注册title>
head>
<body>
<form action="reg" method="post">
<p>
账号:<input type="text" name="userName"/>
p>
<p>
密码:<input type="password" name="pwd"/>
p>
<p>
性别:
<input type="radio" name="sex" value="M"/>男
<input type="radio" name="sex" value="F"/>女
p>
<p>
兴趣:
<input type="checkbox" name="interest" value="food"/>美食
<input type="checkbox" name="interest" value="game"/>竞技
<input type="checkbox" name="interest" value="friend"/>社交
p>
<p>
<input type="submit" value="注册"/>
p>
form>
body>
html>
<servlet>
<servlet-name>regservlet-name>
<servlet-class>web.RegServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>regservlet-name>
<url-pattern>/regurl-pattern>
servlet-mapping>
所有的请求默认都是GET请求
在form上加method=“post”
满足如下规范的类
- 有包
- 有默认的构造器
- 实现序列化接口
- 有get/set方法
package entity;
import java.io.Serializable;
/**
* 建议:
* 1.尽量使用封装类型,因为它比基本类型多了null
* 2.使用java.sql包下的日期,因为JDBC支持这样的日期类型
*
*/
public class Emp implements Serializable {
private Integer empno;
private String ename;
private String job;
private Double sal;
public Integer getEmpno() {
return empno;
}
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;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
}
package dao;
import java.util.List;
import entity.Emp;
public interface EmpDao {
List<Emp> findAll();
void save(Emp e);
}
package dao;
import java.util.ArrayList;
import java.util.List;
import entity.Emp;
public class EmpDaoImpl implements EmpDao {
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 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 dao.EmpDaoImpl;
import entity.Emp;
public class FindEmpServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
//1.接收参数
//2.处理业务(查询)
EmpDao dao = new EmpDaoImpl();
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("增加");
//上面一行用于后面增加员工案例
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();
}
}
<servlet>
<servlet-name>findEmpservlet-name>
<servlet-class>web.FindEmpServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>findEmpservlet-name>
<url-pattern>/findEmpurl-pattern>
servlet-mapping>
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;
import dao.EmpDao;
import dao.EmpDaoImpl;
import entity.Emp;
public class AddEmpServlet extends HttpServlet {
@Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//1.接收参数
String ename = req.getParameter("ename");
String job = req.getParameter("job");
String sal = req.getParameter("sal");
//2.处理业务:保存员工数据
Emp e = new Emp();
e.setEname(ename);
e.setJob(job);
if(sal != null && sal.equals("")) {
e.setSal(new Double(sal));
}
EmpDao dao = new EmpDaoImpl();
dao.save(e);
//3.发送响应
res.setContentType("text/html;charset=utf-8");
PrintWriter w = res.getWriter();
w.println("保存成功
");
w.close();
}
}
<html>
<head>
<meta charset="UTF-8">
<title>增加员工title>
head>
<body>
<form action="addEmp" 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>
<servlet>
<servlet-name>addEmpservlet-name>
<servlet-class>web.AddEmpServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>addEmpservlet-name>
<url-pattern>/addEmpurl-pattern>
servlet-mapping>
注:此案例没连数据库,保存成功并不能真正的增加
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;
import dao.EmpDao;
import dao.EmpDaoImpl;
import entity.Emp;
public class AddEmpServlet extends HttpServlet {
@Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//1.接收参数
String ename = req.getParameter("ename");
String job = req.getParameter("job");
String sal = req.getParameter("sal");
//2.保存员工数据
Emp e = new Emp();
e.setEname(ename);
e.setJob(job);
if(sal != null && sal.equals("")) {
e.setSal(new Double(sal));
}
EmpDao dao = new EmpDaoImpl();
dao.save(e);
//3.发送响应
// res.setContentType("text/html;charset=utf-8");
// PrintWriter w = res.getWriter();
// w.println("保存成功
");
// w.close();
//重定向到查询页面,即
//建议浏览器自己去访问查询页面.
//当前: /EmpManager/addEmp
//目标: /EmpManager/findEmp
res.sendRedirect("findEmp");
}
}
增加员工提交后,会重定向到查询界面
从表面上看URI包含了URL
URI包含了URL
适合规模很小的项目
适合一个项目只写一个Servlet
适合一个项目写少量的几个Servlet
<servlet>
<servlet-name>abcservlet-name>
<servlet-class>web.AbcServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>abcservlet-name>
<url-pattern>*.dungurl-pattern>
servlet-mapping>
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 dao.EmpDaoImpl;
import entity.Emp;
/**
* 路径规范:
* 查询员工:/findEmp.do
* 增加员工:/addEmp.do
*
*/
public class MainServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
//获取请求路径
String path = req.getServletPath();
//根据规范处理路径
if("/findEmp.do".equals(path)) {
findEmp(req,res);
}else if("/addEmp.do".equals(path)) {
addEmp(req,res);
}else {
//该异常抛给服务器,服务器可以统一处理
throw new RuntimeException("查无此页");
}
}
protected void findEmp(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
//1.接收参数
//2.处理业务(查询)
EmpDao dao = new EmpDaoImpl();
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("增加");
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 {
req.setCharacterEncoding("utf-8");
//1.接收参数
String ename = req.getParameter("ename");
String job = req.getParameter("job");
String sal = req.getParameter("sal");
//2.保存员工数据
Emp e = new Emp();
e.setEname(ename);
e.setJob(job);
if(sal != null && sal.equals("")) {
e.setSal(new Double(sal));
}
EmpDao dao = new EmpDaoImpl();
dao.save(e);
//3.发送响应
// res.setContentType("text/html;charset=utf-8");
// PrintWriter w = res.getWriter();
// w.println("保存成功
");
// w.close();
//重定向到查询页面,即
//建议浏览器自己去访问查询页面.
//当前: /EmpManager/addEmp.do
//目标: /EmpManager/findEmp.do
res.sendRedirect("findEmp.do");
}
}
<servlet>
<servlet-name>mainservlet-name>
<servlet-class>web.MainServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>mainservlet-name>
<url-pattern>*.dourl-pattern>
servlet-mapping>
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 HiServlet extends HttpServlet {
public HiServlet() {
System.out.println("实例化HiServlet");
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("初始化HiServlet");
}
@Override
protected void service(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
System.out.println("调用HiServlet处理请求");
}
@Override
public void destroy() {
super.destroy();
System.out.println("销毁HiServlet");
}
}
<servlet>
<servlet-name>hiservlet-name>
<servlet-class>web.HiServletservlet-class>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>hiservlet-name>
<url-pattern>/hiurl-pattern>
servlet-mapping>
由于该参数只是LoginServlet使用,由config读取即可
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 {
//Tomcat创建Servlet的过程:
//LoginServlet ls = new LoginServlet();
//ServletConfig cfg = new ServletConfig();
//ls.init(cfg);
//ls.service();
@Override
public void init(ServletConfig config)throws ServletException {
super.init(config);
String maxOnline = config.getInitParameter("maxOnline");
System.out.println(maxOnline);
}
@Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//此config就是init()传入的那个
ServletConfig cfg = getServletConfig();
String maxOnline = cfg.getInitParameter("maxOnline");
System.out.println(maxOnline);
System.out.println("正在登录...");
}
}
<servlet>
<servlet-name>loginservlet-name>
<servlet-class>web.LoginServletservlet-class>
<init-param>
<param-name>maxOnlineparam-name>
<param-value>3000param-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>loginservlet-name>
<url-pattern>/loginurl-pattern>
servlet-mapping>
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 {
//tomcat启动时就会创建唯一的context,并且会调用它的方法
//加载web.xml中的公用参数,context是全局的,任何servlet都可以使用
ServletContext ctx = getServletContext();
String size = ctx.getInitParameter("size");
System.out.println(size);
System.out.println("分页查询部门数据");
//统计流量
//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);
System.out.println("分页查询员工数据");
//统计流量
//Integer count = (Integer)ctx.getAttribute("count");
//ctx.setAttribute("count", ++count);
//System.out.println(count);
}
}
<servlet>
<servlet-name>findDeptservlet-name>
<servlet-class>web.FindDeptServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>findDeptservlet-name>
<url-pattern>/findDepturl-pattern>
servlet-mapping>
<servlet>
<servlet-name>findEmpservlet-name>
<servlet-class>web.FindEmpServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>findEmpservlet-name>
<url-pattern>/findEmpurl-pattern>
servlet-mapping>
<context-param>
<param-name>sizeparam-name>
<param-value>20param-value>
context-param>
package web;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
/**
* 此类仅仅是在服务器启动时初始化参数的,
* 不负责处理任何具体的请求.
* 一般web项目都要1-2个这样的servlet
*/
public class InitServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//tomcat启动时会优先创建context,然后在创建Servlet
ServletContext ctx = getServletContext();
//流量默认为0
ctx.setAttribute("count", 0);
}
}
<servlet>
<servlet-name>initservlet-name>
<servlet-class>web.InitServletservlet-class>
<load-on-startup>1load-on-startup>
servlet>
此时没有线程安全问题
此时存在线程安全问题
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 {
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 out = res.getWriter();
out.println(salary);
out.close();
//}
}
}
<servlet>
<servlet-name>upservlet-name>
<servlet-class>web.UpServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>upservlet-name>
<url-pattern>/upurl-pattern>
servlet-mapping>