(三十一)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标签库的使用.能够消除大量复杂.繁复的工作.工作量降低的不是一点半点.是降低了一大半 ...
随机推荐
- Linux交换空间(swap space)的那些优缺点
下面的所有例子都在ubuntu-server-x86_64 16.04下执行通过 什么是swap? swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合.简单点说 ...
- 26 Flutter仿京东商城项目 购物车之 event_bus事件广播 事件监听
event_bus 介绍 在前面的课程我们给大家讲过状态管理 Provider 的使用. 通俗的讲状态管理就是:当我们想在多个页面(组件/Widget)之间共享状态(数据),或 者一个页面(组件/Wi ...
- Python3之高阶函数sorted
排序算法 Python内置的sorted()函数可以对list进行排序 >>> sorted([36,5,-12,9,-21]) [-21, -12, 5, 9, 36] 此外,so ...
- Object.defineProperty()方法学习笔记
这是js中一个非常重要的方法,ES6中某些方法的实现依赖于它,VUE通过它实现双向绑定 此方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象 参数 Object.def ...
- 设置主机防火墙规则(iptables规则设置及其与firewalld的生死纠葛)
一.什么是firewalld防火墙? firewalld防火墙在Linux主机里其实就是一道隔离工具,它只对进出主机的请求做判断处理.也就是说它只管进出,至于你进来后做了什么,就不在firewalld ...
- C#使用KingAOP实现AOP面向切面编程二
本文继续上篇讲述一下比较复杂点的AOP例子,先新建一个控制台项目,然后同样先在Nuget中搜索安装KingAop到项目中 1.项目结构 2 .定义一个登录实体类User和LoggingAspect切面 ...
- eNSP——配置基于地址池的DHCP
原理: 实验案例: 拓扑图: 实验编址: 1.基础配置 根据实验编址进行实验的基础配置. 2.基于接口配置DHCP Server功能 在R1上开启dhcp 功能,在接口上开启dhcp服务功能,指定从接 ...
- [转帖]详解JVM内存布局及GC原理,值得收藏
概述 https://www.toutiao.com/i6731345429574713868/ java发展历史上出现过很多垃圾回收器,各有各的适应场景,不仅仅是开发,作为运维也需要对这方面有一定的 ...
- 如何安装Oracle--新手安装Oracle教程
1. 将win32_11gR2_database_1of2.zip与win32_11gR2_database_1of2.zip 解压到当前目录 PS:选中两个压缩包后右键解压到当前文件夹:必须同时解压 ...
- Tcp问题汇总
一 TCP三次握手 PS:TCP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』.不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据. 起初,服务器和客户端都为CLOS ...