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”,这样就可以从数据库中删除。



(三十一)web 开发基础项目的更多相关文章

  1. [置顶] 提高生产力:Web开发基础平台WebCommon的设计和实现

    Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...

  2. 提高生产力:Web开发基础平台WebCommon的设计和实现

    Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...

  3. Java进阶(三十一) Web服务调用

    Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd5 ...

  4. 第五模块:WEB开发基础 第3章·BootStrap&JQuery开发

    01-JQuery介绍 02-jQuery文件引入和加载的区别 03-jQuery的基础选择器 04-jQuery的层级选择器 05-jQuery的基本过滤选择器 06-jQuery的属性选择器 07 ...

  5. PHP 系列:PHP Web 开发基础

    PHP是动态类型的Web开发的脚本语言,PHP以页面文件作为加载和运行的单元,PHP现在有了Composer作为开发包管理. 1.使用Composer管理依赖 自从.NET开发用了Nuget管理程序集 ...

  6. 第五模块:WEB开发基础 第1章·HTML&CSS基础

    01-前端介绍 02-HTML介绍 03-HTML文档结构 04-head标签相关内容 05-常用标签一之h1~h6,p,a 06-常用标签一之ul.ol.div.img.span 07-常用标签二- ...

  7. 移动端web开发基础概念

    最近在了解移动端web开发的相关知识,有些概念总是模糊不清,这次花费了一些时间整体的梳理了一遍. 分辨率 分辨率可以从显示分辨率与图像分辨率两个方向来分类.显示分辨率(屏幕分辨率)是屏幕图像的精密度, ...

  8. 移动WEB开发基础入门

    什么是移动WEB开发,我个人理解就是,将网页更好的显示在移动端的一些设置,简单来说就两点如下: 1.流式布局,即百分比自适应布局 将body下的div容器的样式设置如下: div{ width:100 ...

  9. Java Web开发基础(3)-JSTL

    在DRP项目中接触到了JSTL标签库,对我这样的比較懒的人来说,第一感觉就是"惊艳". JSTL标签库的使用.能够消除大量复杂.繁复的工作.工作量降低的不是一点半点.是降低了一大半 ...

随机推荐

  1. c语言复杂申明解释程序

    c语言复杂声明的解释 目标:分析一个将c语言复杂申明解释为英语的一个程序 首先介绍一种简单的读声明的方法,来源网络 1.右左法则 从标识符开始(或者最内层的结构,如果不存在标识符的话,通常出现于函数指 ...

  2. 不同操作系统上DNS客户端操作区别汇总

    结论:windows有DNS缓存,Linux默认无DNS缓存,只能依赖于安装其他软件. 一.不同操作系统的客户端的DNS缓存差别 1.windows 系统中dns 解析器会使用系统的dns缓存来提高d ...

  3. 阶段5 3.微服务项目【学成在线】_day18 用户授权_07-动态查询用户权限-权限数据模型

    3 动态查询用户权限 3.1 需求分析 截至目前在测试授权时使用的权限数据是静态数据,正常情况的流程是: 1.管理员给用户分配权限,权限数据写到数据库中. 2.认证服务在进行用户认证时从数据库读取用户 ...

  4. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_19-认证接口开发-接口开发-controller

    补充controller方法 判断是否有值传过来. 私有方法存储cookie httpOnly设置为false的话 浏览器就拿到这个cookie 拿到Response cookie在配置文件内的配置 ...

  5. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_04-用户认证技术方案-SpringSecurityOauth2

    2.3 Spring security Oauth2认证解决方案 本项目采用 Spring security + Oauth2完成用户认证及用户授权,Spring security 是一个强大的和高度 ...

  6. 【418】C语言ADT实现Quack(stack+queue)

    quack.h #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct ...

  7. 123457123456#0#-----com.twoapp.TruckCarRun01--前拼后广--大卡车游戏jiemei

    com.twoapp.TruckCarRun01--前拼后广--大卡车游戏jiemei

  8. 如何让在panel里的子窗体随panel的大小改变而变化?(转)

            private void Form1_Load(object sender, EventArgs e)         {             frm=new Form2();   ...

  9. 多林环境中的ADFS

    公司有两个或更多Active Directory林,但是只有一个ADFS,如何让ADFS支持多个域林呢?(一个ADFS只能部署在一个域中,不能跨域) 答案是:在部署ADFS的林和所有其他林之间建立双向 ...

  10. XenServer 根分区空间满的解决办法

    1.清除已经应用的旧补丁文件 删除 /var/patch/ 下的除 applied 之外的所有文件 2.清除旧版的Xen-Tools文件 删除 /opt/xensource/packages/iso/ ...