Servlet是一个类
它是一种java技术,主要用于开发动态网页
它成功的一种应用技术就是JSP动态网页
主要动作是:接收浏览器的请求,完成相应的处理,产生相应的响应结果送回给浏览器
主要参数:request,response,即请求和响应
概念:
服务器,容器,实例,实例化,载入,初始化,服务(service(),doGet(),doPost())
请求,调用,返回
重点:Servlet生命周期
第一次被请求时,服务器完成初始化,创建Servlet对象,Servlet对象调用init()方法
如果有多个用户请求,则为每个客户启动一个线程,而Servlet成员变量会被多个客户共享【java多线程】
第一次完成初始化后,就常驻服务器内存中
Servlet对象调用service()方法
如果有多个用户请求,则为每个客户启动一个线程,它运行在不同的线程中,互不干扰
服务器关闭时,Servlet对象调用destroy()方法
它需要容器支持,通常先配置好tomcat
然后创建servlet即可,用模板方式创建是比较方便的
在doGet或是doPost方法中添加处理,然后就可以进行测试【一般浏览器请求就是GET或是POST这两种,如果不用类似于postman之类的工具,浏览器的请求可以直接用URL完成GET方式请求,用form表单的提交完成post方式的请求】
完成Servlet开发后,需要配置Servlet,即在web.xml文件中进行配置,虽然新的版本提倡用注解的方式,但写一写xml文件,有助于理解
它包括:
类名配置,类文件映射,URL地址映射
写配置文件时,从上往下依次写节点:,但用的时候,是从下往上看去理解
从URL找Servlet name然后由Servlet name找Servlet class
所谓发布Servlet,本质上就是把生成的Servlet class放到容器中去,即发布到服务器上
如果顺利完成了发布,则就可以在浏览器端请求该Servlet来做相应的业务了
直接在浏览器地址栏中,输入相应的URL,就可以向服务器请求调用相应的Servlet,从而就可以完成测试和调用
1 可以在web.xml文件中设置参数,然后在servlet中来读取和使用该参数
全局参数设置,在web.xml中添加context-param节点
VarName
VarValue
局部参数设置,在servet节点中添加init-param子节点
在节点中增加即可
VarName
VarValue
2 获取参数的方法
全局获取
ServletContext context = this.getServletContext();
context.getInitParameter("VarName");
局部获取
this.getInitParameter("VarName");
本质上是一个类,是一个Servlet【javax.servlet.Filter】
它本身不能生成请求对象和响应对象,因而不能完成业务,但能提供过滤作用。
即在业务之前做准备工作
业务之后做善后工作
但主要业务它做不了,因为无法给用户响应,只能在相应的Servlet【即被过滤的Servlet】在接收请求和给出响应时,对请求对象和响应对象进行检查和修改。,当然,被过滤的不一定全都是Servlet,它可以是其它资源,如JSP,Servlet,HTML等
通常过滤器的处理过程是一个链式过滤过程。
认证
日志
审核
字符串OR图片格式转换
数据压缩
密码和令牌
触发资源访问事件
ETC
1 init()
2 doFilter()
3 destory()
本质上是一个类【javax.servlet.http.HttpSessionListener】
监听事件源,即三个域对象:
ServletContext
HttpSession
ServletRequest
主要是监听对象的创建,销毁,增加属性,删除或替换属性,激活与否等
数据库只有一张表,演示实现CRUD操作
create table stu(
id int primary KEY
,name varchar(45) not NULL
,age int not null
,gender varchar(45) not null
,major varchar(45) not NULL
);
insert into stu(id,name,age,gender,major) values(1,'郑萌萌',21,'男','计算机科学与应用');
insert into stu(id,name,age,gender,major) values(2,'王小虎',22,'女','软件工程');
insert into stu(id,name,age,gender,major) values(3,'李磊',23,'男','数字媒体');
insert into stu(id,name,age,gender,major) values(4,'刘高高',25,'女','信息安全');
select * from stu;
stuSystem
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
pageDisplay
com.fhzheng.servlet.PageDisplay
pageDisplay
/pageDisplay
index.html 主页面和界面
DEMO学生管理系统
数据库操作:
存在的问题:
1 如果MySQL版本比较高,就会的更新操作上的提示,修改和删除数据不能成功,因为需要做事务提交
2 如果要成为一个系统,界面需要进一步做开发
3 一个基本的系统,应该有用户管理和系统管理模块
4 这个只是一个演示系统,业务描述不明确
Student.java 数据bean
package com.fhzheng.bean;
public class Student {
private Integer id;
private String name;
private Integer age;
private String gender;
private String major;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public Student() {
// TODO Auto-generated constructor stub
}
public Student(Integer id, String name, Integer age, String gender, String major) {
super();
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.major = major;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", major=" + major
+ ", getId()=" + getId() + ", getName()=" + getName() + ", getAge()=" + getAge() + ", getGender()="
+ getGender() + ", getMajor()=" + getMajor() + ", getClass()=" + getClass() + ", hashCode()="
+ hashCode() + ", toString()=" + super.toString() + "]";
}
}
DBUtils.java 数据库访问层实现,主要实现的是CRUD操作
package com.fhzheng.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;
import com.fhzheng.bean.Student;
import com.sun.org.apache.xml.internal.security.Init;
import com.sun.org.apache.xpath.internal.operations.And;
import javafx.css.PseudoClass;
public class DBUtils {
Connection conn = null;
PreparedStatement ps =null;
ResultSet rs = null;
public DBUtils() {
init();
}
/**
* 数据库访问初始化操作,创建连接
*/
private void init() {
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//访问库参数
String url = "jdbc:mysql://localhost:3306/student";
String user = "root";
String password = "rootcuit";
//创建连接
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException | ClassNotFoundException e) {
System.out.println("数据库访问异常");
e.printStackTrace();
}
}
/**
* 插入数据
* @param stu对象
*/
public void insert(Student st) {
try {
//用student对象封装学生信息
int id = st.getId();
String name = st.getName();
int age = st.getAge();
String gender = st.getGender();
String major = st.getMajor();
//创建SQL插入语句
String sql = "insert into stu(id,name,age,gender,major)"
+" values(?,?,?,?,?)";
//执行库操作
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.setString(2, name);
ps.setInt(3, age);
ps.setString(4, gender);
ps.setString(5, major);
ps.executeUpdate();
} catch (SQLException e) {
System.out.println("插入数据异常");
e.printStackTrace();
} finally {
try {
if (ps != null && !ps.isClosed() ) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 按学号删除数据
* @param id学号,字符串
*/
public void delete(String id) {
try {
String sql = "delete from student where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
Integer stuId = Integer.parseInt(id);
ps.setInt(1, stuId);
ps.executeUpdate();
} catch (Exception e) {
System.out.println("删除数据异常");
e.printStackTrace();
} finally {
try {
if (ps != null && !ps.isClosed() ) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 更新数据
* @param stu对象
*/
public void update(Student stu) {
try {
//从封装对象中获取数据
int id = stu.getId();
String name = stu.getName();
int age = stu.getAge();
String gender = stu.getGender();
String major = stu.getMajor();
//更新sql语句
String sql ="update stu set "+
" name = ?,age = ?,gender=?,major=? where id= ?";
//执行库操作
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.setString(2, name);
ps.setInt(3, age);
ps.setString(4, gender);
ps.setString(5, major);
ps.executeUpdate();
} catch (Exception e) {
System.out.println("更新数据异常");
e.printStackTrace();
} finally {
try {
if (ps != null && !ps.isClosed() ) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public Set selectStu(String id,String name){
try {
Set sts = new HashSet();
if (id.isEmpty()) {
id="";
}
if (name.isEmpty()) {
name="";
}
if ("".equals(id)&&"".equals(name)) {
String sql = "select * from stu";
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
}
if (!"".equals(id)&&"".equals(name)) {
String sql = "select * from stu where id=?";
ps=conn.prepareStatement(sql);
Integer stuId = Integer.parseInt(id);
ps.setInt(1, stuId);
rs=ps.executeQuery();
}
if ("".equals(id)&&!"".equals(name)) {
String sql = "select * from stu where name=?";
ps=conn.prepareStatement(sql);
ps.setString(1, name);
rs=ps.executeQuery();
}
if (!"".equals(id)&&!"".equals(name)) {
String sql = "select * from stu where id=? and name=?";
ps=conn.prepareStatement(sql);
Integer stuId = Integer.parseInt(id);
ps.setInt(1, stuId);
ps.setString(2, name);
rs=ps.executeQuery();
}
while (rs.next()) {
Student student = new Student();
student.setId(rs.getInt("id"));
student.setAge(rs.getInt("age"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setMajor(rs.getString("major"));
sts.add(student);
}
return sts;
} catch (Exception e) {
System.out.println("查询数据异常");
e.printStackTrace();
return null;
} finally {
try {
if (ps != null && !ps.isClosed() ) {
ps.close();
}
if (rs != null && !rs.isClosed() ) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
PageDisplay.java 业务层实现,主要实现的是CRUD业务
package com.fhzheng.servlet;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.JOptionPane;
import com.fhzheng.bean.Student;
import com.fhzheng.client.OutPut;
import com.fhzheng.db.DBUtils;
public class PageDisplay extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 7098298399222118506L;
protected void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
this.doPost(req,resp);
}
protected void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String op = req.getParameter("op");
int method = Integer.parseInt(op);
/**
* 核心业务逻辑
*/
try {
if (method == 0) {
insert(req,resp);
}else if (method == 1) {
delete(req,resp);
}else if (method == 2) {
update(req,resp);
}else if (method == 3) {
select(req,resp);
}else {
updateById(req,resp);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/**
* 判断串里面是不是纯数字
* @param str
* @return
*/
public boolean isNumber(String str) {
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("[0-9]*");
java.util.regex.Matcher matcher = pattern.matcher(str);
if (matcher.matches()==false) {
return false;
} else {
return true;
}
}
/**
* 按ID号更新学生数据业务
* @param req
* @param resp
*/
private void updateById(HttpServletRequest req, HttpServletResponse resp)
throws ClassNotFoundException,SQLException,IOException{
List result = new ArrayList();
String id = req.getParameter("id");
DBUtils dbUtils = new DBUtils();
Set sts = dbUtils.selectStu(id, "");
Iterator it = sts.iterator();
String str = "";
result.add(str);
OutPut.outputToClient(result, resp);
}
/**
* 查询学生数据业务
* @param req
* @param resp
*/
private void select(HttpServletRequest req, HttpServletResponse resp)
throws ClassNotFoundException,SQLException,IOException{
List result = new ArrayList();
String id = req.getParameter("id");
String name = req.getParameter("name");
if (id == null) {
id="";
}
if (name == null) {
name="";
}
DBUtils dbUtils = new DBUtils();
Set sts = dbUtils.selectStu(id, name);
String str = "";
str = "";
result.add(str);
str=""
+ "学号 "
+ "姓名 "
+ "年龄 "
+ "性别 "
+ "专业 "
+ "操作 "
+ " ";
result.add(str);
Iterator it = sts.iterator();
while (it.hasNext()) {
Student stu = it.next();
str=""
+ ""+stu.getId()+" "
+ ""+stu.getName()+" "
+ ""+stu.getAge()+" "
+ ""+stu.getGender()+" "
+ ""+stu.getMajor()+" "
+ ""
+ "删除"
+ "修改"
+ " "
+ " ";
result.add(str);
}
str="
返回主页面";
result.add(str);
OutPut.outputToClient(result, resp);
}
/**
* 更新学生数据业务
* @param req
* @param resp
* @throws IOException
*/
private void update(HttpServletRequest req, HttpServletResponse resp)
throws ClassNotFoundException,SQLException,IOException {
String id = req.getParameter("id");
String name = req.getParameter("name");
String age = req.getParameter("age");
String gender = req.getParameter("gender");
String major = req.getParameter("major");
Student stu = new Student();
stu.setId(Integer.parseInt(id));
stu.setName(name);
stu.setAge(Integer.parseInt(age));
stu.setGender(gender);
stu.setMajor(major);
DBUtils dbUtils = new DBUtils();
dbUtils.update(stu);
resp.sendRedirect("/stuSystem/pageDisplay?op=3");
}
/**
* 删除学和数据业务
* @param req
* @param resp
* @throws IOException
*/
private void delete(HttpServletRequest req, HttpServletResponse resp)
throws ClassNotFoundException,SQLException, IOException {
String id = req.getParameter("id");
DBUtils dbUtils = new DBUtils();
dbUtils.delete(id);
resp.sendRedirect("/stuSystem/pageDisplay?op=3");
}
/**
* 插入学生数据业务
* @param req
* @param resp
*/
private void insert(HttpServletRequest req, HttpServletResponse resp)
throws ClassNotFoundException,SQLException,IOException{
String id = req.getParameter("id");
String name = req.getParameter("name");
String age = req.getParameter("age");
String gender = req.getParameter("gender");
String major = req.getParameter("major");
//简单的数据验证
if (id.equals("")||age.equals("")) {
JOptionPane.showMessageDialog(null, "学号和年龄不能为空,且必须为整数");
resp.sendRedirect("index.html");
}else if (isNumber(age)==false) {
JOptionPane.showMessageDialog(null, "年龄必须为整数,请重新输入");
resp.sendRedirect("index.html");
}else {
Student stu= new Student();
stu.setId(Integer.parseInt(id));
stu.setName(name);
stu.setAge(Integer.parseInt(age));
stu.setGender(gender);
stu.setMajor(major);
DBUtils dbUtils = new DBUtils();
dbUtils.insert(stu);
resp.sendRedirect("/stuSystem/pageDisplay?op=3");
}
}
}
OutPut.java 显示工具
package com.fhzheng.client;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
public class OutPut {
public static void outputToClient(String result,HttpServletResponse response)
throws IOException
{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("");
out.println("");
out.println(" A Servlet ");
out.println(" ");
out.println(result);
out.println(" ");
out.println("");
out.flush();
out.close();
}
public static void outputToClient(List list,HttpServletResponse response)
throws IOException
{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("");
out.println("");
out.println(" A Servlet ");
out.println(" ");
for(int i = 0; i < list.size(); i++)
{
out.println(list.get(i));
}
out.println(" ");
out.println("");
out.flush();
out.close();
}
}
存在的问题:
1 如果MySQL版本比较高,就会的更新操作上的提示,修改和删除数据不能成功,因为需要做事务提交
2 如果要成为一个系统,界面需要进一步做开发
3 一个基本的系统,应该有用户管理和系统管理模块
4 这个只是一个演示系统,业务描述不明确
5 主键未自动生成,有隐患
6 未实现模糊查询
7 未实现分页查询
8 在真实的业务中,未实现逻辑删除操作,需要重新设计数据库字段