1.  编写index.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="servlet/login?action=add" method="post">
用户名:<input type="text" name="userName" /><br/>
密&nbsp;码:<input type="password" name="passWd" /><br/>
年&nbsp;龄:<input type="text" name="age" /><br/>
<input type="submit" />
</form>
</body>
</html>

2.  设计数据库,确定po包、dao包、bo包、service包

  2.1  设计数据库

  2.2  确定po包,存放的是永久化对象,即与数据库的表一一对应。

userPO.java

 package po;

 import java.util.Date;

 public class UserPO {
private String userName;
private String passWd;
private Date birthday; public UserPO(){
} public UserPO(String userName, String passWd, Date birthday) {
super();
this.userName = userName;
this.passWd = passWd;
this.birthday = birthday;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassWd() {
return passWd;
} public void setPassWd(String passWd) {
this.passWd = passWd;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}

2.3  确定dao包,包里存的是操作数据的对象(对数据库的增删改查),一般有接口+实现+工具类.

  • UserDAOI.java
 package dao;

 import java.util.List;

 import po.UserPO;

 public interface UserDAOI {
public boolean addUser(UserPO user);
public boolean delUser(String userName);
public boolean uptUser(UserPO user);
public List<UserPO> gets(); }
  • DBUtil.java
 package dao;

 import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List; import com.mchange.v2.c3p0.ComboPooledDataSource; import po.UserPO; public class DBUtil {
public static ComboPooledDataSource dateSource; static{
dateSource=new ComboPooledDataSource();
final String URL="jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8";
final String USER="root";
final String PASSWD="";
final String Driver="com.mysql.jdbc.Driver"; try {
dateSource.setDriverClass(Driver);
dateSource.setJdbcUrl(URL);
dateSource.setUser(USER);
dateSource.setPassword(PASSWD);
dateSource.setMaxPoolSize(100);
dateSource.setMinPoolSize(10);
dateSource.setMaxStatements(10000);
} catch (Exception e) {
e.printStackTrace();
} } /**
*
* @return 连接池中的连接
*/
public static Connection getConn(){
try {
return dateSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
} /**
*
* 增删改方法
* @param sql sql语句
* @param list sql语句中的?值
* @return
*/
public static boolean cud(String sql,List<Object> list){
boolean flag=false;
Connection conn=null;
PreparedStatement pstat=null;
try{
conn=getConn();
pstat=conn.prepareStatement(sql); if(list!=null){
for(int i=0;i<list.size();i++){
pstat.setObject(i+1, list.get(i));
}
} int res=pstat.executeUpdate();
if(res>0){
flag=true;
} }catch(Exception e){
e.printStackTrace();
}finally{
close(conn, pstat, null);
} return flag;
} /**
* 关闭流
* @param conn 连接流
* @param pstat sql语句流
* @param res 结果集流
*/
public static void close(Connection conn,PreparedStatement pstat,ResultSet res){ try{
if(conn!=null)
{
conn.close();
}
if(pstat!=null)
{
pstat.close();
}if(res!=null)
{
res.close();
}
}
catch(Exception e)
{
e.printStackTrace();
} } /**查找数据库中所有po对象并返回list
     *@param sql sql语句
     *@param list 存放sql预处理语句中的?值
     */
public static List<UserPO> gets(String sql,List<Object> list) {
List<UserPO> users=new ArrayList<UserPO>();
UserPO user=null;
Connection conn=null;
PreparedStatement pstat=null;
ResultSet res=null;
try
{
conn=DBUtil.getConn();
pstat=conn.prepareStatement(sql); if(list!=null)
{
for(int i=0;i<list.size();i++)
{
pstat.setObject(i+1, list.get(i));
} } res=pstat.executeQuery(); while(res.next())
{
user=new UserPO();
user.setUserName(res.getString("userName"));
user.setBirthday(res.getDate("birthday"));
user.setPassWd(res.getString("passWd"));
users.add(user);
} }
catch(Exception e)
{
e.printStackTrace();
}finally
{
close(conn, pstat, res);
}
return users;
} }
  • UserDAOImpl.java
package dao;

import java.awt.geom.CubicCurve2D;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List; import po.UserPO; public class UserPOImpl implements UserDAOI { public boolean addUser(UserPO user) {
String sql="insert into user values(?,?,?)";
List<Object> list=new ArrayList<Object>();
list.add(user.getUserName());
list.add(user.getPassWd());
list.add(user.getBirthday());
return DBUtil.cud(sql, list);
} public boolean delUser(String userName) {
String sql="delete from user where userName=?";
List<Object> list=new ArrayList<Object>();
list.add(userName); return DBUtil.cud(sql, list);
} public boolean uptUser(UserPO user) {
String sql="update user set passWd=?,birthday=? where userName=?";
List<Object> list=new ArrayList<Object>();
list.add(user.getPassWd());
list.add(user.getBirthday());
list.add(user.getUserName()); return DBUtil.cud(sql, list);
} public List<UserPO> gets() {
String sql="select * from user";
return DBUtil.gets(sql, null);
} }

2.4  确定bo包,存放的是对象,即与用户提供的信息一一对应。

  • userBO.java
 package bo;

 public class UserBO {
private String userName;
private String passWd;
private String age; public UserBO()
{ } public UserBO(String userName, String passWd, String age) {
super();
this.userName = userName;
this.passWd = passWd;
this.age = age;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassWd() {
return passWd;
} public void setPassWd(String passWd) {
this.passWd = passWd;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} }

  解析: bo对象与po对象不同点在于: bo对象是业务对象,存放的数据是用户直接提供的,以本题为例,用户数据为userName、passWd、age,bo对象成员属性也为这三个,而

po对象则是存放于数据库中的数据,即用户数据经过处理之后才能存放于数据库中(比如用户注册的age数据,如果数据库中直接存放age毫无意义,因为第二年的时候age+1,数据库管理员还得给每个age+1),po对象存放的数据为userName、passWd、birthday。

2.5 确定service包,将servlet得到的原始数据(即用户数据)转换为DAO包里的数据格式。

 

  • userServiceI.java
 package service;

 import java.util.List;

 import bo.UserBO;

 public interface UserServiceI {
public boolean addUser(UserBO user);
public boolean delUser(String userName);
public boolean uptUser(UserBO user);
public List<UserBO> gets();
}
  • userServiceImpl.java
 package service;

 import java.util.ArrayList;
import java.util.Date;
import java.util.List; import bo.UserBO;
import dao.UserPOImpl;
import po.UserPO; public class UserServiceImpl implements UserServiceI {
UserPOImpl im=new UserPOImpl(); public boolean addUser(UserBO user) { return im.addUser(bo2po(user));
} public boolean delUser(String userName) {
im.delUser(userName);
return true;
} public boolean uptUser(UserBO user) { return im.uptUser(bo2po(user));
} public List<UserBO> gets() { List<UserPO> poList=im.gets(); return po2bo(poList);
} /**
* 把BO对象转为PO对象,这个方法只适用于增加和修改操作
*
* @param user
* @return
*/
private UserPO bo2po(UserBO user)
{ UserPO userpo=new UserPO(); Date date=new Date();
@SuppressWarnings("deprecation")
int year=date.getYear(); //拿到今年第几年
int yearDB=year-Integer.parseInt(user.getAge()); //得到存入数据库的年份
@SuppressWarnings("deprecation")
Date date1=new Date(yearDB,date.getMonth(),date.getDay()); userpo.setBirthday(date1);
userpo.setUserName(user.getUserName());
userpo.setPassWd(user.getPassWd()); return userpo;
}
/**
* 把存有PO对象的List转为存有BO对象的List
* 步骤:
* 1. 拿到存有PO对象的list容器之后,进行遍历
* 2. 每次遍历都要new一个BO对象,然后把PO对象的值对应转化为BO对象
* 3. 返回存放BO对象的list
* @param userpo
* @return BO对象
*/
private List<UserBO> po2bo(List<UserPO> poList)
{
List<UserBO> boList=new ArrayList<UserBO>();
UserBO userbo=null;
for(int i=0;i<poList.size();i++)
{
userbo=new UserBO();
userbo.setUserName(poList.get(i).getUserName());
userbo.setPassWd(poList.get(i).getPassWd());
Date birthday=poList.get(i).getBirthday();
Date getYear=new Date();
int age=getYear.getYear()-birthday.getYear();
userbo.setAge(String.valueOf(age)); boList.add(userbo);
} return boList;
} }

3. 编写servlet包

  • LoginServlet.java
package srevlet;

import java.io.IOException;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import bo.UserBO;
import service.UserServiceImpl; public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public LoginServlet() {
super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//拿到用户数据
UserBO user=null;
UserServiceImpl userIm=new UserServiceImpl();
String userName=request.getParameter("userName");
String passWd=request.getParameter("passWd");
String age=request.getParameter("age"); String action=request.getParameter("action"); if(action.equals("add"))
{
//增加一条记录
user=new UserBO();
user.setUserName(userName);
user.setPassWd(passWd);
user.setAge(age);
userIm.addUser(user);
}
if(action.equals("del"))
{
//删除一条记录
String name=request.getParameter("userName");
userIm.delUser(name);
}
if(action.equals("upt"))
{
user=new UserBO();
user.setAge(request.getParameter("age"));
user.setPassWd(request.getParameter("passWd"));
user.setUserName(request.getParameter("userName"));
userIm.uptUser(user); }
if(action.equals("gets"))
{
//拿到数据库的全部数据
List<UserBO> listbo=userIm.gets();
for(int i=0;i<listbo.size();i++)
{
System.out.println(listbo.get(i).getUserName()+" "+listbo.get(i).getAge()+" "+listbo.get(i).getPassWd());
} }
} }

结果:

解析: 查看servlet 当action=del的时候,会执行servlet的相应操作,request.getParameter("userName"); 可以得到地址栏里的userName的值“nihao”,这样就可以从数据库中删除。



最新文章

  1. ASP.NET Core真实管道详解[1]:中间件是个什么东西?
  2. ASP.NET MVC增删改查
  3. 关于高负载服务器Kernel的TCP参数优化
  4. August 17th 2016 Week 34th Wednesday
  5. windows7添�windows2008R2域配置
  6. [ECNU 1624] 求交集多边形面积
  7. JAVA-2-DATA
  8. python一句代码建立树
  9. JavaScript中定义变量和存储值的类型判断
  10. Problem G
  11. 【JavaScript声明变量的规则】
  12. leetCode之旅(5)-博弈论中极为经典的尼姆游戏
  13. D. GukiZ and Binary Operations(矩阵+二进制)
  14. 二、core abp 数据库迁移
  15. 关于pythoh面向过程开发人员三步转面向对象的补充,再加一步,四步走战略。转面向对象也可以有固定公式。
  16. 线程同步-SpinWait
  17. [视频]K8软件破解脱壳入门教程
  18. ElasticSearch - Node
  19. 想转C++了
  20. 蓝牙协议 HFP,HSP,A2DP,A2DP_CT,A2DP_TG,AVRCP,OPP,PBAP,SPP,FTP,TP,DTMF,DUN,SDP

热门文章

  1. FLYAI
  2. 数字图像处理--算术、几何、谐波、逆谐波均值滤波器Matlab
  3. appium-FAQ(持续更新...)
  4. 持续集成和部署工具GOCD
  5. Linux 验证当前 Video0 不否是v4l设备 linux v4l 编程(1) Video 4 Linux 简介
  6. 算法习题---3.11换抵挡装置(UVa1588)
  7. java获取properties配置文件中某个属性最简单方法
  8. Python - Django - 编辑作者
  9. 【用户体验度量】用户费力度评分(CES)
  10. orcale11g安装