导入jar包
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<welcome-file-list>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
asm-5.2.jar
asm-commons-5.2.jar
asm-tree-5.2.jar
commons-dbutils-1.6.jar
commons-fileupload-1.3.3.jar
commons-io-2.5.jar
commons-lang3-3.6.jar
druid-1.0.26.jar
fastjson-1.2.21.jar
freemarker-2.3.26-incubating.jar
javassist-3.20.0-GA.jar
jsp-api.jar
log4j-api-2.9.1.jar
log4j-core-2.9.1.jar
mysql-connector-java-5.1.40-bin.jar
ognl-3.1.15.jar
servlet-api.jar
struts2-core-2.5.16.jar
taglibs-standard-impl-1.2.5.jar
taglibs-standard-spec-1.2.5.jar
欢迎界面 index,xml
<script type="text/javascript">
//跳转到列表页面
window.location.href = "list.action";
</script>
添加页面addUI.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>
<h1>添加用户页面</h1>
<form action="${pageContext.request.contextPath}/add.action" method="post">
<input type="text" name="model.logname"/><br/>
<input type="password" name="model.password"/><br/>
<input type="submit" value="添加"/>
</form>
</body>
</html
列表页面list.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>
<h1>添加用户页面</h1>
<form action="${pageContext.request.contextPath}/add.action" method="post">
<input type="text" name="model.logname"/><br/>
<input type="password" name="model.password"/><br/>
<input type="submit" value="添加"/>
</form>
</body>
</html>
修改页面 updateUI.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>
<h1>修改用户页面</h1>
<form action="${pageContext.request.contextPath }/update.action" method="post">
<input type="hidden" value="${user.userid }" name="model.userid">
<input type="text" name="model.logname" value="${user.logname }"/><br/>
<input type="password" name="model.password" value="${user.password }"/><br/>
<input type="submit" value="添加"/>
</form>
</body>
</html>
导入script
配置好Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="p1" extends="struts-default">
<action name="list" class="com.xingxue.crud.web.controller.UserInfoController" method="list">
<result name="list">
/WEB-INF/jsps/list.jsp
</result>
</action>
<action name="addUI" class="com.xingxue.crud.web.controller.UserInfoController" method="addUI">
<result name="addUI">
/WEB-INF/jsps/addUI.jsp
</result>
</action>
<action name="add" class="com.xingxue.crud.web.controller.UserInfoController" method="add">
<result name="toList" type="redirectAction">
<param name="actionName">list.action</param>
</result>
</action>
<action name="del" class="com.xingxue.crud.web.controller.UserInfoController" method="del">
<result name="del" type="redirectAction">
<param name="actionName">list.action</param>
</result>
</action>
<action name="updateUI" class="com.xingxue.crud.web.controller.UserInfoController" method="updateUI">
<result name="updateUI">
/WEB-INF/jsps/upateUI.jsp
</result>
</action>
<action name="update" class="com.xingxue.crud.web.controller.UserInfoController" method="update">
<result name="toList" type="redirectAction">
<param name="actionName">list.action</param>
</result>
</action>
</package>
</struts>
连接数据库
url=jdbc:mysql:///xingxue27
username=root
password=root
driverClassName=com.mysql.jdbc.Driver
util 动作类的 帮助类
package com.xingxue.crud.util;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
public class ActionUtils {
/**
* 向request 域对象中 放入数据
*/
public static void putToRequest(String key, Object value) {
getRequest().setAttribute(key, value);
}
/**
* 向request 域对象中 取数据
*/
public static void getToRequest(String key) {
getRequest().getAttribute(key);
}
private static HttpServletRequest getRequest() {
return ServletActionContext.getRequest();
}
}
util 连接数据库的帮助类
package com.xingxue.crud.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
//jdbc工具类
public class DBUtil {
private static final DataSource DATASOURCE;
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
static {
try {
InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties");
Properties p = new Properties();
p.load(inStream);
DATASOURCE = DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
throw new ExceptionInInitializerError("jdbc配置文件加载错误!!");
}
}
private DBUtil() {
}
/**
* 通过连接池获取的连接对象
*
* @return
*/
public static Connection getConn() {
try {
Connection conn = null;
// 先从线程中取Connection对象
if (tl.get() == null) {
conn = DATASOURCE.getConnection();
// 放入到当前线程中
tl.set(conn);
}
return tl.get();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage() + "----创建connection 失败----");
}
}
/**
* 开启事务
*/
public static void startTransaction() {
Connection conn = getConn();
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 提交事务
*/
public static void commit() {
try {
Connection conn = getConn();
conn.commit();
conn.close();
tl.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 事务回滚
*/
public static void rollback() {
try {
Connection conn = getConn();
conn.rollback();
conn.close();
tl.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 得到数据源对象
*
*/
public static DataSource getDataSource() {
return DATASOURCE;
}
}
util 加密帮助类
package com.xingxue.crud.util;
import java.security.MessageDigest;
public class MD5Util {
private MD5Util() {
}
public static String md5Encode(String text) {
// 用于加密的字符
char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
try {
// 使用平台的默认字符集将此 String 编码为 byte序列,并将结果存储到一个新的 byte数组中
byte[] btInput = text.getBytes();
// 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// MessageDigest对象通过使用 update方法处理数据, 使用指定的byte数组更新摘要
mdInst.update(btInput);
// 摘要更新之后,通过调用digest()执行哈希计算,获得密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) { // i = 0
byte byte0 = md[i]; // 95
str[k++] = md5String[byte0 >>> 4 & 0xf]; // 5
str[k++] = md5String[byte0 & 0xf]; // F
}
// 返回经过加密后的字符串
return new String(str);
} catch (Exception e) {
return null;
}
}
}
model 跟数据库的名称一致
package com.xingxue.crud.model;
public class UserInfoModel {
private Long userid;
private String logname;
private String password;
public Long getUserid() {
return userid;
}
public void setUserid(Long userid) {
this.userid = userid;
}
public String getLogname() {
return logname;
}
public void setLogname(String logname) {
this.logname = logname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
control 调度室 起一个承上启下的作用
package com.xingxue.crud.web.controller;
import java.util.List;
import com.xingxue.crud.model.UserInfoModel;
import com.xingxue.crud.service.IUserInfoService;
import com.xingxue.crud.service.impl.UserInfoServiceImpl;
import com.xingxue.crud.util.ActionUtils;
public class UserInfoController {
private static final String LIST = "list";
private static final String ADDUI = "addUI";
private static final String TOLIST = "toList";
private static final String DEL = "del";
private static final String UPDATEUI = "updateUI";
private IUserInfoService userInfoService = new UserInfoServiceImpl();
public UserInfoModel model = new UserInfoModel();
/**
* 响应列表页面的 接口
*
* @return list 逻辑视图名称
*/
public String list() {
List<UserInfoModel> users = userInfoService.list();
ActionUtils.putToRequest("users", users);
return UserInfoController.LIST;
}
/**
* 响应添加页面 接口
*/
public String addUI() {
return UserInfoController.ADDUI;
}
/**
* 响应 添加数据 接口
*
* @return
*/
public String add() {
// 1.把 添加页面的数据保存到数据库中
userInfoService.addUserInfo(model);
return UserInfoController.TOLIST;
}
/**
* 删除一个用户
*
* @return
*/
public String del() {
userInfoService.deleteUserById(model.getUserid());
return UserInfoController.DEL;
}
/**
* 响应修改页面 接口
*
* @return
*/
public String updateUI() {
// 查询更新用户的数据
UserInfoModel user = userInfoService.getUserById(model.getUserid());
ActionUtils.putToRequest("user", user);
return UserInfoController.UPDATEUI;
}
/**
* 更新数据
*
* @return
*/
public String update() {
userInfoService.updateUserById(model);
return UserInfoController.TOLIST;
}
}
service 接口 这个和Dao层差不多 就是查什么就导入什么 然后再去导下面的方法 最后再去写自己的实现类
package com.xingxue.crud.service;
import java.util.List;
import com.xingxue.crud.model.UserInfoModel;
public interface IUserInfoService {
/**
* 添加用户的业务方法
*
* @param model
* 页面数据
*/
void addUserInfo(UserInfoModel model);
/**
* 获取列表 数据
*
* @return List 集合
*/
List<UserInfoModel> list();
void deleteUserById(Long userid);
UserInfoModel getUserById(Long userid);
void updateUserById(UserInfoModel model);
}
serviceIMPL 实现类
package com.xingxue.crud.service.impl;
import java.util.List;
import com.xingxue.crud.dao.IUserInfoDao;
import com.xingxue.crud.dao.impl.UserInfoDaoImpl;
import com.xingxue.crud.model.UserInfoModel;
import com.xingxue.crud.service.IUserInfoService;
import com.xingxue.crud.util.DBUtil;
public class UserInfoServiceImpl implements IUserInfoService {
private IUserInfoDao userInfoDao = new UserInfoDaoImpl();
public void addUserInfo(UserInfoModel model) {
DBUtil.startTransaction();
try {
userInfoDao.insert(model);
} catch (Exception e) {
e.printStackTrace();
DBUtil.rollback();
return;
}
DBUtil.commit();
}
@Override
public List<UserInfoModel> list() {
DBUtil.startTransaction();
try {
return userInfoDao.getAll();
} catch (Exception e) {
e.printStackTrace();
DBUtil.rollback();
}
DBUtil.commit();
return null;
}
@Override
public void deleteUserById(Long userid) {
DBUtil.startTransaction();
try {
userInfoDao.deletById(userid);
} catch (Exception e) {
e.printStackTrace();
DBUtil.rollback();
return;
}
DBUtil.commit();
}
@Override
public UserInfoModel getUserById(Long userid) {
DBUtil.startTransaction();
try {
return userInfoDao.getById(userid);
} catch (Exception e) {
e.printStackTrace();
DBUtil.rollback();
}
DBUtil.commit();
return null;
}
@Override
public void updateUserById(UserInfoModel model) {
DBUtil.startTransaction();
try {
userInfoDao.updateById(model);
} catch (Exception e) {
e.printStackTrace();
DBUtil.rollback();
return;
}
DBUtil.commit();
}
}
dao 层 主要是数据访问层
package com.xingxue.crud.dao;
import java.util.List;
import com.xingxue.crud.model.UserInfoModel;
public interface IUserInfoDao {
void insert(UserInfoModel model);
List<UserInfoModel> getAll();
void deletById(Long userid);
UserInfoModel getById(Long userid);
void updateById(UserInfoModel model);
}
DaoIMPL 实现层 主要是写SQL的
package com.xingxue.crud.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.xingxue.crud.dao.IUserInfoDao;
import com.xingxue.crud.model.UserInfoModel;
import com.xingxue.crud.util.DBUtil;
import com.xingxue.crud.util.MD5Util;
public class UserInfoDaoImpl implements IUserInfoDao {
private QueryRunner qr = new QueryRunner();
public void insert(UserInfoModel model) {
try {
qr.update(DBUtil.getConn(),//
"INSERT INTO TB_USERINFO (LOGNAME,PASSWORD)VALUES(?,?)",//
model.getLogname(),//
MD5Util.md5Encode(model.getPassword()));//
} catch (SQLException e) {
e.printStackTrace();
}
}
public List<UserInfoModel> getAll() {
try {
return qr.query(DBUtil.getConn(), //
"select * from tb_userinfo",//
new BeanListHandler<UserInfoModel>(UserInfoModel.class) //
);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public void deletById(Long userid) {
try {
qr.update(DBUtil.getConn(),//
"delete from tb_userinfo where userid = ?",//
userid);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public UserInfoModel getById(Long userid) {
try {
return qr.query(DBUtil.getConn(),//
"select * from tb_userinfo where userid = ?",//
new BeanHandler<UserInfoModel>(UserInfoModel.class),//
userid);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public void updateById(UserInfoModel model) {
try {
qr.update(DBUtil.getConn(), //
"update tb_userinfo set logname =?,password=? where userid = ?",//
model.getLogname(),//
MD5Util.md5Encode(model.getPassword()),//
model.getUserid());
} catch (SQLException e) {
e.printStackTrace();
}//
}
}
对了 我们还要配置好web.xml 里面可是设置一进来就访问主页 Struts的过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<welcome-file-list>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>