javaee-study-04 Servlet读解-实现增删改查示例-未引入事务提交

Servlet是一个类
它是一种java技术,主要用于开发动态网页
它成功的一种应用技术就是JSP动态网页

主要动作是:接收浏览器的请求,完成相应的处理,产生相应的响应结果送回给浏览器

主要参数:request,response,即请求和响应

Servlet工作原理

概念:
服务器,容器,实例,实例化,载入,初始化,服务(service(),doGet(),doPost())
请求,调用,返回

重点:Servlet生命周期
第一次被请求时,服务器完成初始化,创建Servlet对象,Servlet对象调用init()方法
    如果有多个用户请求,则为每个客户启动一个线程,而Servlet成员变量会被多个客户共享【java多线程】
    第一次完成初始化后,就常驻服务器内存中
Servlet对象调用service()方法
    如果有多个用户请求,则为每个客户启动一个线程,它运行在不同的线程中,互不干扰
服务器关闭时,Servlet对象调用destroy()方法

在eclipse中开发Servlet

它需要容器支持,通常先配置好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,本质上就是把生成的Servlet class放到容器中去,即发布到服务器上
如果顺利完成了发布,则就可以在浏览器端请求该Servlet来做相应的业务了

调用Servlet

直接在浏览器地址栏中,输入相应的URL,就可以向服务器请求调用相应的Servlet,从而就可以完成测试和调用

在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

Filter过滤器

本质上是一个类,是一个Servlet【javax.servlet.Filter】
它本身不能生成请求对象和响应对象,因而不能完成业务,但能提供过滤作用。
即在业务之前做准备工作
业务之后做善后工作
但主要业务它做不了,因为无法给用户响应,只能在相应的Servlet【即被过滤的Servlet】在接收请求和给出响应时,对请求对象和响应对象进行检查和修改。,当然,被过滤的不一定全都是Servlet,它可以是其它资源,如JSP,Servlet,HTML等

通常过滤器的处理过程是一个链式过滤过程。

过滤器常用情形

认证
日志
审核
字符串OR图片格式转换
数据压缩
密码和令牌
触发资源访问事件
ETC

过滤器LifeCycle

1 init()
2 doFilter()
3 destory()

过滤器的配置与Servlet的配置差不多,在web.xml中进行

    
      
      
      
    
      
      

Listener监听器

本质上是一个类【javax.servlet.http.HttpSessionListener】
监听事件源,即三个域对象:
ServletContext
HttpSession
ServletRequest
主要是监听对象的创建,销毁,增加属性,删除或替换属性,激活与否等

实例,用Servlet完成对student.db库的CRUD操作

数据库只有一张表,演示实现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;

数据库如图所示:
javaee-study-04 Servlet读解-实现增删改查示例-未引入事务提交_第1张图片

示例如下,运行主界面是:
javaee-study-04 Servlet读解-实现增删改查示例-未引入事务提交_第2张图片
查询结果
javaee-study-04 Servlet读解-实现增删改查示例-未引入事务提交_第3张图片
修改界面
javaee-study-04 Servlet读解-实现增删改查示例-未引入事务提交_第4张图片

工程界面是:
javaee-study-04 Servlet读解-实现增删改查示例-未引入事务提交_第5张图片
主要代码文档:
web.xml 核心配置文件



  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); while (it.hasNext()) { Student stu = it.next(); str = "学号:
" + "姓名:
" + "年龄:
" + "性别:
" + "专业:
"; result.add(str); } 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="" + "" + "" + "" + "" + "" + "" + ""; result.add(str); } str="
学号姓名年龄性别专业操作
"+stu.getId()+""+stu.getName()+""+stu.getAge()+""+stu.getGender()+""+stu.getMajor()+"" + "删除" + "修改" + "

返回主页面"; 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 在真实的业务中,未实现逻辑删除操作,需要重新设计数据库字段

你可能感兴趣的:(javaee)