(三十一)web 开发基础项目
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/>
密 码:<input type="password" name="passWd" /><br/>
年 龄:<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 开发基础项目的更多相关文章
- [置顶] 提高生产力:Web开发基础平台WebCommon的设计和实现
Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...
- 提高生产力:Web开发基础平台WebCommon的设计和实现
Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...
- Java进阶(三十一) Web服务调用
Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd5 ...
- 第五模块:WEB开发基础 第3章·BootStrap&JQuery开发
01-JQuery介绍 02-jQuery文件引入和加载的区别 03-jQuery的基础选择器 04-jQuery的层级选择器 05-jQuery的基本过滤选择器 06-jQuery的属性选择器 07 ...
- PHP 系列:PHP Web 开发基础
PHP是动态类型的Web开发的脚本语言,PHP以页面文件作为加载和运行的单元,PHP现在有了Composer作为开发包管理. 1.使用Composer管理依赖 自从.NET开发用了Nuget管理程序集 ...
- 第五模块:WEB开发基础 第1章·HTML&CSS基础
01-前端介绍 02-HTML介绍 03-HTML文档结构 04-head标签相关内容 05-常用标签一之h1~h6,p,a 06-常用标签一之ul.ol.div.img.span 07-常用标签二- ...
- 移动端web开发基础概念
最近在了解移动端web开发的相关知识,有些概念总是模糊不清,这次花费了一些时间整体的梳理了一遍. 分辨率 分辨率可以从显示分辨率与图像分辨率两个方向来分类.显示分辨率(屏幕分辨率)是屏幕图像的精密度, ...
- 移动WEB开发基础入门
什么是移动WEB开发,我个人理解就是,将网页更好的显示在移动端的一些设置,简单来说就两点如下: 1.流式布局,即百分比自适应布局 将body下的div容器的样式设置如下: div{ width:100 ...
- Java Web开发基础(3)-JSTL
在DRP项目中接触到了JSTL标签库,对我这样的比較懒的人来说,第一感觉就是"惊艳". JSTL标签库的使用.能够消除大量复杂.繁复的工作.工作量降低的不是一点半点.是降低了一大半 ...
随机推荐
- Cesium Workshop
参考资料: https://cesiumjs.org/tutorials/Cesium-Workshop/ https://github.com/geoadmin/workshop-cesium3d ...
- Windows安装Centos7双系统后Windows启动项消失
原文: https://www.cnblogs.com/xinglichao/p/9999049.html https://blog.csdn.net/yingzinanfei/article/det ...
- Mysql技巧及问题目录
Mysql技巧及问题目录: MySQL批量导入Excel.txt数据 MySQL批量导入Excel数据
- ubuntu 12.04 nfs-server/client安装配置
由于opennebula的共享存储的方式需要nfs,为了opennebula 3.8在ubuntu 12.04上搭建做铺垫,先介绍下nfs server和client端的安装和配置. 1. nfs ...
- PAT 甲级 1053 Path of Equal Weight (30 分)(dfs,vector内元素排序,有一小坑点)
1053 Path of Equal Weight (30 分) Given a non-empty tree with root R, and with weight Wi assigne ...
- delphi ADOQUery中错误解决方法"无法为更新定位行。一些值可能已在最后...
使用delphi中的ADOQuery控件中自带的,insert ,edit,delete此操作时,有时会出现下面的错误提示,提示错误信息:"无法为更新定位行.一些值可能已在最后一次读取后已更 ...
- (十三)过滤器Filter(转)
--------转自孤傲苍狼博客 一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例 ...
- pip3 install pyinstaller 报错了的处理方法
http://www.pyinstaller.org/downloads.html 下载压缩包 解压到本地后,在目录处cmd 执行命令 python setup.py install 然后执行pip ...
- 高级UI-DrawerLayout侧滑
侧滑的方案有很多种,早期的开源SliddingMenu,以及后来的DrawerLayout以及NavigationView等都可实现侧滑效果,这里介绍的是DrawerLayout,下一节将介绍Navi ...
- Vue双向数据绑定简易实现
一.vue中的双向数据绑定主要使用到了Object.defineProperty(新版的使用Proxy实现的)对Model层的数据进行getter和setter进行劫持,修改Model层数据的时候,在 ...