使用struts2框架来实现CRUD(create、read、update、delete)

来源:互联网 发布:智能健康数据分析图 编辑:程序博客网 时间:2024/05/29 18:08
1相关的类和包
使用struts2框架来实现CRUD(create、read、update、delete) - 不惊者 - 码农小屋
2、源码:
struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<constant name="struts.locale" value="en_US"/>


<package name="crud1" namespace="/" extends="struts-default">

<interceptors>
<!-- 自定义拦截器 -->
<interceptor name="mylogger" class="com.huai.interceptor.LoggerInterceptor"/>
<!--自定义一个拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="mylogger"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!--设置默认的自定义拦截器,不再是系统的defaultStack -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>

<action name="userToList" class="com.huai.action.UserAction" method="toList">

<result name="toList">/list.jsp</result>
</action>
<action name="userToAdd" class="com.huai.action.UserAction" method="toAdd">
<result name="toAdd">/add.jsp</result>
</action>
<action name="userAdd" class="com.huai.action.UserAction" method="add">
<result name="toList">/list.jsp</result>
<result name="toAdd">/add.jsp</result>
<result name="input">/add.jsp</result>
</action>
<action name="userToUpdate" class="com.huai.action.UserAction" method="toUpdate">
<result name="toUpdate">/update.jsp</result>
</action>
<action name="userUpdate" class="com.huai.action.UserAction" method="update">
<result name="toList">/list.jsp</result>
</action>
<action name="userDelete" class="com.huai.action.UserAction" method="delete">
<result name="toList">/list.jsp</result>
</action>
<action name="userToQuery" class="com.huai.action.UserAction" method="toQuery">
<result name="toQuery">/query.jsp</result>
</action>
<action name="userQuery" class="com.huai.action.UserAction" method="query">
<result name="toList">/list.jsp</result>
<result name="input">/query.jsp</result>
</action>
</package>

</struts>


UserAction

package com.huai.action;

import java.util.List;

import com.db.dao.DAOImpl;
import com.opensymphony.xwork2.ActionSupport;
import com.ov.UserModel;
import com.ov.UserQueryModel;

public class UserAction extends ActionSupport{

/**
*
*/
private static final long serialVersionUID = 1L;

private List<UserModel> list;
private String[] sexs = new String[]{"男","女"};
private UserModel user;
private UserQueryModel uqm;

private String info;

public List<UserModel> getList() {
return list;
}
public void setList(List<UserModel> list) {
this.list = list;
}

public String[] getSexs(){
return this.sexs;
}
public void setSexs(String[] sexs){
this.sexs = sexs;
}

public UserModel getUser(){
return this.user;
}
public void setUser(UserModel user){
this.user = user;
}

public UserQueryModel getUqm() {
return uqm;
}
public void setUqm(UserQueryModel uqm) {
this.uqm = uqm;
}
public String getInfo(){
return this.info;
}
public void setInfo(String info){
this.info = info;
}




public String toList()throws Exception{
DAOImpl dao = new DAOImpl();
list = dao.getAll();
return "toList";
}

public String toAdd()throws Exception{
return "toAdd";
}

public String add()throws Exception{
DAOImpl dao = new DAOImpl();

UserModel user_temp = null;
//先判断增加的用户的id是否已经存在
//先用添加的userId号遍历数据库,返回一个user对象
user_temp=dao.getSingle(user.getUserId());
if(user_temp == null){
dao.create(user);
return this.toList();
}else{
this.info = "The userId has existed !";
return "toAdd";
}

}
public String toUpdate()throws Exception{
DAOImpl dao = new DAOImpl();
user = dao.getSingle(user.getUserId());
return "toUpdate";
}

public String update()throws Exception{
DAOImpl dao = new DAOImpl();
dao.update(user);
return toList();
}

public String delete()throws Exception{
DAOImpl dao = new DAOImpl();
dao.delete(user.getUserId());
return this.toList();
}
public String toQuery()throws Exception{
return "toQuery";
}

public String query()throws Exception{
DAOImpl dao = new DAOImpl();
list = dao.getByCondition(uqm);
return "toList";
}

}


DataSourceHolder

package com.db_source;

import java.beans.PropertyVetoException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceHolder {

private ComboPooledDataSource cpds = null;

public DataSourceHolder() throws PropertyVetoException{
//这里使用了c3p0的数据源获取数据库的connection
//没有c3p0-config.xml文件,这里用快捷配置方式

cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" );
cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test" );
cpds.setUser("root");
cpds.setPassword("mysql");
}


public ComboPooledDataSource getDataSource(){
return this.cpds;
}

}

DAOImpl

package com.db.dao;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

import com.db_source.DataSourceHolder;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.ov.UserModel;
import com.ov.UserQueryModel;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class DAOImpl {

private ComboPooledDataSource dataSourceHolder = null;

public DAOImpl(){
try {
dataSourceHolder = new DataSourceHolder().getDataSource();
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}


//create a user
public void create(UserModel user){
Connection conn = null;

try {
conn = dataSourceHolder.getConnection();

final String sql = "insert into tb1_user(userId, name, sex, age) values(?,?,?,?)";
java.sql.PreparedStatement ps = conn.prepareStatement(sql);

int count = 1;

ps.setInt(count++, user.getUserId());
ps.setString(count++, user.getName());
ps.setString(count++, user.getSex());
ps.setInt(count++, user.getAge());
ps.execute();

ps.close();

} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

//modify user's information
public void update(UserModel user){
Connection conn = null;

try {
conn = dataSourceHolder.getConnection();

final String sql = "update tb1_user set name=?, sex=?, age=? where userId=?";
java.sql.PreparedStatement ps = conn.prepareStatement(sql);

int count = 1;
ps.setString(count++, user.getName());
ps.setString(count++, user.getSex());
ps.setInt(count++, user.getAge());
ps.setInt(count++, user.getUserId());

ps.execute();

ps.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}

public void delete(int userId){
Connection conn = null;

try {
conn = dataSourceHolder.getConnection();

final String sql = "delete from tb1_user where userId=?";
java.sql.PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, userId);
ps.execute();

ps.close();
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

//返回单个用户-user
public UserModel getSingle(int userId){
UserModel user = null;
Connection conn = null;

try {
conn = dataSourceHolder.getConnection();

final String sql = "select * from tb1_user where userId=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, userId);
ResultSet rs = ps.executeQuery();

if(rs.next()){
user = this.rs2Model(rs);
}


rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;

}

private UserModel rs2Model(ResultSet rs)throws Exception{
UserModel user = new UserModel();
user.setUserId(rs.getInt("userId"));
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex"));
user.setAge(rs.getInt("age"));
return user;
}

//返回所有用户
public List<UserModel> getAll(){
List<UserModel> list = new ArrayList<UserModel>();

Connection conn = null;

try{
conn = dataSourceHolder.getConnection();
//
final String sql = "select * from tb1_user order by userId";

PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();

while(rs.next()){
UserModel user = this.rs2Model(rs);
list.add(user);
}

rs.close();
ps.close();


}catch(Exception e){
e.printStackTrace();
}finally{
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return list;
}


//下面几个用于选择性查询
//此方法生成查询命令的where
private String generateWhere(UserQueryModel uqm){
StringBuffer buffer = new StringBuffer();
if(uqm.getUserId() > 0){
buffer.append(" and userId = ? ");
}
if(uqm.getName() != null && uqm.getName().trim().length() > 0){
buffer.append(" and name like ? ");
}
if(uqm.getSex() != null && uqm.getSex().trim().length() > 0){
buffer.append(" and sex = ? ");
}
if(uqm.getAge() > 0){
buffer.append(" and age >= ? ");
}
if(uqm.getAge2() > 0){
buffer.append(" and age <= ? ");
}
return buffer.toString();
}

private void preparePs(UserQueryModel uqm, PreparedStatement ps) throws SQLException{
int count = 1;

if(uqm.getUserId() > 0){
ps.setInt(count++, uqm.getUserId());
}
if(uqm.getName() != null && uqm.getName().trim().length() > 0){
ps.setString(count++, "%"+uqm.getName()+"%");
}
if(uqm.getSex() != null && uqm.getSex().trim().length() > 0){
ps.setString(count++, uqm.getSex());
}
if(uqm.getAge() > 0){
ps.setInt(count++, uqm.getAge());
}
if(uqm.getAge2() > 0){
ps.setInt(count++, uqm.getAge2());
}
}

public List<UserModel> getByCondition(UserQueryModel uqm){
List<UserModel>list = new ArrayList<UserModel>();
Connection conn = null;

try {
conn = dataSourceHolder.getConnection();
final String sql = "select * from tb1_user where 1=1 "+this.generateWhere(uqm)+" order by userId";

PreparedStatement ps = conn.prepareStatement(sql);

this.preparePs(uqm, ps);

ResultSet rs = ps.executeQuery();

while(rs.next()){
UserModel user = this.rs2Model(rs);
list.add(user);
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
}

UserModel

package com.ov;

public class UserModel {

private int userId;
private String name;
private String sex;
private int age;

public UserModel(){}

public UserModel(int userId, String name, String sex, int age){
this.userId = userId;
this.name = name;
this.sex = sex;
this.age = age;
}

public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.hashCode());
result = prime * result + userId;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserModel other = (UserModel) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
if (userId != other.userId)
return false;
return true;
}


}


UserQueryModel

package com.ov;


public class UserQueryModel extends UserModel{

private int age2;

public int getAge2() {
return age2;
}

public void setAge2(int age2) {
this.age2 = age2;
}

}

UserAction-en-US.properties

add.title = Create a User
add.submit = Create
update.title = Update a User
update.submit = Update
query.title = Query Users
query.submit = Query
query.age1 = Min Age
query.age2 = Max Age
query.error = your min age is more than your max age.
list.title = Users Info
list.operation = operation
list.add=Create a User
list.query = Query Users
user.userId = userId
user.name = name
user.sex = sex
user.age = age

UserAction-zh-CN.properties

add.title = \u6DFB\u52A0\u7528\u6237
add.submit = \u6DFB\u52A0
update.title = \u4FEE\u6539\u7528\u6237
update.submit = \u4FEE\u6539
query.title = \u67E5\u8BE2\u7528\u6237
query.submit = \u67E5\u8BE2
query.age1 = \u5E74\u9F84\u6700\u5C0F\u503C
query.age2 = \u5E74\u9F84\u6700\u5927\u503C
query.error = \u60A8\u8F93\u5165\u7684\u5E74\u9F84\u6700\u5C0F\u503C\u5927\u4E8E\u6700\u5927\u503C
list.title = \u7528\u6237\u4FE1\u606F
list.operation = \u64CD\u4F5C
list.add=\u6DFB\u52A0\u7528\u6237
list.query = \u67E5\u8BE2\u7528\u6237
user.userId = \u7528\u6237\u7F16\u53F7
user.name = \u59D3\u540D
user.sex = \u6027\u522B
user.age = \u5E74\u9F84

UserAction-userAdd-validation.xml(这是UserAction类中的userAdd方法中的xml验证文件)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>
<field name="user.userId">
<field-validator type="int">
<param name="min">1</param>
<message>请输入编号,整数类型</message>
</field-validator>
</field>
<field name="user.name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>请填写姓名</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">50</param>
<message>请输入的年龄在${min}到之间${max}</message>
</field-validator>

</field>
</validators>


UserAction-userQuery-validation.xml(这是UserAction类中的uerQuery方法中的验证xml文件)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>
<validator type="expression">
<param name="expression">
<!-- ![CDATA[]的作用是是不用一些符号的转义-->
<![CDATA[(uqm.age2 > 0 && uqm.age <= uqm.age2) || uqm.age2 == 0]]>
</param>
<message key="query.error"/>
</validator>
</validators>

LoggerInterceptor

package com.huai.interceptor;

import java.util.Map;

import org.apache.struts2.dispatcher.*;

import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class LoggerInterceptor implements Interceptor{


/**
* 这个类实现了拦截器Interceptor接口
* 目的是打印相关信息,便于程序调试
* 方法的执行时间是在action之前,而在result之后
*
*
* 注意:去掉此类不会影响到整个项目
*/
private static final long serialVersionUID = 1L;


@Override
public void destroy() {

}

@Override
public void init() {

}

@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("--------------------------------");
//打印当前的action类名
System.out.println("Action: "+invocation.getAction().getClass().getName());

//打印action类中所调用的方法
System.out.println("Method: "+invocation.getProxy().getMethod());

//打印当前上下文context之中的所有request参数
//参数是以映射的关系存放的
Map<String, Object> params = invocation.getInvocationContext().getParameters();

for(String key : params.keySet()){
Object obj = params.get(key);

//遍历打印映射中的数组
if(obj instanceof String[]){
String[] arr = (String[])obj;
System.out.println("Param: "+key);

for(String value : arr){
System.out.println(value);
}
}
}
/**
* 此方法前面的代码在action之前执行
* 此方法后面的代码在result之后执行
* 注意:如果没有invoke()方法,将不会执行后面的invocation(拦截器)
*/
String resultCode = invocation.invoke();
Result rresult = invocation.getResult();
if(rresult instanceof ServletDispatcherResult){
ServletDispatcherResult result = (ServletDispatcherResult)rresult;
//打印result所调转到的jsp页面名称
System.out.println("JSP: "+result.getLastFinalLocation());
}
System.out.println("---------------------------------");
return resultCode;
}

}

list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>list_show_page</title>

</head>
<body>
<center>
<h1>显示用户信息</h1>
<h2>
<s:a href="/strutsdemon_crud001/userToAdd.action">添加用户</s:a>
</h2>
<h2>
<s:a href="/strutsdemon_crud001/userToQuery.action">查询用户</s:a>
</h2>
</center>

<table align="center" border="1" cellpadding="1" cellspacing="0">
<tr>
<td>编号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td colspan="2" align="center">操作</td>
</tr>

<s:iterator value="list">
<tr>
<td><s:property value="userId" /></td>
<td><s:property value="name" /></td>
<td><s:property value="sex" /></td>
<td><s:property value="age" /></td>
<td><a
href="/strutsdemon_crud001/userToUpdate.action?user.userId=<s:property value='userId'/>">
修改 </a></td>
<!--这个是javascript的用法,作用是当用户按下删除键的时候提醒用户是否确定删除-->
<td><a href="javascript:if(confirm('Are you sure ?'))
window.location.href='/strutsdemon_crud001/userDelete.action?user.userId=<s:property value='userId'/>'">
删除
</a>
</td>
</tr>
</s:iterator>
</table>
</body>
</html>

add.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags"%>
<!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><s:text name="add.title"/></title>

</head>
<body>
<h1>add-page</h1>
<h4><s:property value="info"/></h4>
<s:form action="userAdd" method="post" namespace="/">
<%--
<s:textfield name="user.userId" label="编号"></s:textfield>
<s:textfield name="user.name" label="姓名"></s:textfield>
<s:select list="sexs" name="user.sex" label="性别"></s:select>
<s:textfield name="user.age" label="年龄"></s:textfield>
<s:submit value="添加"></s:submit>
--%>

<s:textfield name="user.userId" key="user.userId"/>
<s:textfield name="user.name" key="user.name"/>
<s:select name="user.sex" list="sexs" key="user.sex"/>
<s:textfield name="user.age" key="user.age"/>
<s:submit name="" key="add.submit"/>
</s:form>
</body>
</html>

query.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>查询用户信息</title>
</head>
<body>
<center>
<s:actionerror/>
<h1><s:text name="query.title"/></h1>
<s:form action="userQuery" method="post" namespace="/" >
<!-- 这是非国际化标签的输入表 -->
<%--
<s:textfield name="uqm.userId" label="编号" value="0"/>
<s:textfield name="uqm.name" label="姓名"/>
<s:select name="uqm.sex" list="sexs" label="性别" headerKey="" headerValue="请选择"/>
<s:textfield name="uqm.age" label="年龄最小值" value="0"/>
<s:textfield name="uqm.age2" label="年龄最大值" value="0"/>
<s:submit value="查询"/>
--%>

<!--下面用到了国际化标签,所以有key -->
<s:textfield name="uqm.userId" key="user.userId"/>
<s:textfield name="uqm.name" key="user.name"/>
<s:select name="uqm.sex" list="sexs" headerKey="" headerValue="Choose" key="user.sex"/>
<s:textfield name="uqm.age" value="0" key="query.age1"/>
<s:textfield name="uqm.age2" value="0" key="query.age2"/>
<s:submit name="" key="add.submit"/>
</s:form>
</center>
</body>
</html>


 update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>update-page</title>
</head>
<body>
<h2>Update-Page</h2>
<s:form action="userUpdate" method="post" namespace="/">
<s:textfield name="user.userId" label="编号"></s:textfield>
<s:textfield name="user.name" label="姓名"></s:textfield>
<s:select list="sexs" name="user.sex" label="性别"></s:select>
<s:textfield name="user.age" label="年龄"></s:textfield>
<s:submit value="修改"></s:submit>
</s:form>
</body>
</html>

最后,还需配置web.xml文件(这个很简单),还要在INF-Web下面的lib中复制相关的jar包,包括数据库连接驱动、struts包和c3p0包。数据库的表tb1_user的属性分别是userId  name  sex age ,userId是primary key!
struts2 框架是如此的方面,如此的easy!!!!!
0 0