list.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户管理</title>
<script type="text/javascript"
src="jquery/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
var SUCCESS=1;
$(function(){
loadUsers();
$('#save').click(saveUser);
$('#users').on('click', 'tr', loadUser);
$('#update').click(updateUser);
$('#add').click(cleanForm);
});
function updateUser(){
//获取表单数据, 发送到服务器
var name = $('#name').val();
var password = $('#password').val();
var age = $('#age').val();
var salary = $('#salary').val();
var id = $(this).data('user').id;
var url = 'user/update.do';
var data = {id:id, name:name, age:age,
password: password, salary:salary};
console.log(data);
$.post(url, data, function(result){
console.log(result);
if(result.state==SUCCESS){
loadUsers();
cleanForm();
}else{
alert(result.message);
}
});
}
function loadUser(){
// $(this) 就是 tr 对象
var id = $(this).data('id');
console.log(id);
var url = 'user/load.do';
var data = {id:id};
$.getJSON(url, data, function(result){
console.log(result);
if(result.state==SUCCESS){
showUser(result.data);
}else{
alert(result.message);
}
});
}
function showUser(user){
$('#name').val(user.name);
$('#password').val(user.password);
$('#age').val(user.age);
$('#salary').val(user.salary);
$('#update').data('user', user).show();
$('#save').hide();
$('#title').html('更新用户信息');
}
function saveUser(){
var name = $('#name').val();
var password = $('#password').val();
var age = $('#age').val();
var salary = $('#salary').val();
var url='user/save.do';
var data={name:name,
password:password,
age:age,
salary:salary};
$.post(url, data, function(result){
if(result.state==SUCCESS){
var data = result.data;
console.log(data);
loadUsers();
cleanForm();
}else{
alser(result.message);
}
});
}
function cleanForm(){
$('#name').val('');
$('#password').val('');
$('#age').val('');
$('#salary').val('');
$('#title').html('添加用户');
$('#save').show();
$('#update').hide();
}
function loadUsers(){
var url='user/list.do';
$.getJSON(url, function(result){
if(result.state==SUCCESS){
var users = result.data;
console.log(users);
showUsers(users);
}else{
alert(result.message);
}
});
}
function showUsers(users){
var tbody = $('#users tbody');
tbody.empty();
for(var i=0; i<users.length; i++){
var u = users[i];
var tr=template.replace('[id]', u.id)
.replace('[name]', u.name)
.replace('[age]', u.age);
tr = $(tr).data('id', u.id);
tbody.append(tr);
}
}
var template='<tr><td>[id]</td>'+
'<td>[name]</td>'+
'<td>[age]</td></tr>';
</script>
</head>
<body>
<div>
<h1>用户管理</h1>
<input type="button" value="添加" id="add">
</div>
<div>
<h2>全部用户</h2>
<table id="users">
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Tom</td>
<td>5</td>
</tr>
</tbody>
</table>
</div>
<div>
<h2 id="title">添加用户</h2>
<div>
<label>用户名:</label>
<input type="text" id="name">
</div>
<div>
<label>密码:</label>
<input type="password" id="password">
</div>
<div>
<label>年龄:</label>
<input type="text" id="age">
</div>
<div>
<label>薪资:</label>
<input type="text" id="salary">
</div>
<div>
<input type="button"
value="保存" id="save">
<input type="button"
style="display:none;"
value="更新" id="update">
</div>
</div>
</body>
</html>
UserAction
package cn.tedu.action;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import cn.tedu.entity.User;
import cn.tedu.service.UserService;
import cn.tedu.util.JsonResult;
@Controller
@Scope("prototype")
public class UserAction {
@Resource
private UserService userService;
private JsonResult result;
public JsonResult getResult() {
return result;
}
public void setResult(JsonResult result) {
this.result = result;
}
public String list(){
List<Map<String,Object>> list=userService.userList();
System.out.println("list:");
for(Map<String,Object> map:list) {
System.out.println(map);
}
result=new JsonResult(list);
System.out.println(result);
return "json";
}
private String name;
private String password;
private Integer age;
private Double salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public String save(){
boolean ok=userService.saveUser(name,password,age,salary);
result=new JsonResult(ok);
return "json";
}
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String load() {
User user=userService.loadUser(id);
result=new JsonResult(user);
return "json";
}
public String update() {
userService.updateUser(id,name,password,age,salary);
result=new JsonResult("ok");
return "json";
}
}
UserActionDaoImpl
package cn.tedu.dao.impl;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import cn.tedu.dao.UserDao;
import cn.tedu.entity.User;
@Repository("userDao")
@Transactional
public class UserDaoImpl implements UserDao{
@Resource
private HibernateTemplate hibernateTemplate;
public int addUser(User user) {
Object id=hibernateTemplate.save(user);
return id==null ? 0 : 1;
}
public int updateUser(User user) {
hibernateTemplate.update(user);
return 1;
}
public int deleteUser(Integer id) {
User user=hibernateTemplate.get(User.class,id);
hibernateTemplate.delete(user);
return 1;
}
public User findById(Integer id){
User user=hibernateTemplate.get(User.class, id);
return user;
}
public List<User> findAll() {
String hql="from User";
List<User> list=(List<User>) hibernateTemplate.find(hql);
return list;
}
public User findByName(String name) {
String hql="from User where name=?";
List<User> list=(List<User>) hibernateTemplate.find(hql,name);
if(list.isEmpty()) {
return null;
}
return list.get(0);
}
public List<Map<String, Object>> findAllUser() {
String hql="select new map(id as id,name as name,age as age) from User";
List<Map<String,Object>> list=(List<Map<String, Object>>) hibernateTemplate.find(hql);
return list;
}
public int findMaxId() {
//sql:select max(u_id) from t_user
String hql="select max(id) from User";
List<Number> list=(List<Number>) hibernateTemplate.find(hql);
return list.get(0).intValue();
}
}
UserService
package cn.tedu.service;
import java.sql.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.management.RuntimeErrorException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.tedu.dao.UserDao;
import cn.tedu.entity.User;
@Service("userService")
@Transactional
public class UserServiceImpl implements UserService{
@Resource
private UserDao userDao;
public List<Map<String, Object>> userList() {
return userDao.findAllUser();
}
public boolean saveUser(String name, String password, Integer age, Double salary) {
long now=System.currentTimeMillis();
//int max=userDao.findMaxId();
//int id=max+1;
Integer id= null;
User user=new User(id,name,password,age,salary,new Date(now));
int n=userDao.addUser(user);
return n==1;
}
public User loadUser(Integer id) {
if(id==null) {
throw new RuntimeException("id 不能为空");
}
return userDao.findById(id);
}
public void updateUser(Integer id, String name, String password, Integer age, Double salary) {
User user=userDao.findById(id);
user.setAge(age);
user.setName(name);
user.setSalary(salary);
user.setPassword(password);
long now=System.currentTimeMillis();
user.setHiredate(new Date(now));
userDao.updateUser(user);
}
}
JsonResult
package cn.tedu.util;
import java.io.Serializable;
public class JsonResult<T> implements Serializable {
private static final long serialVersionUID = -2722313840903428077L;
public static final int SUCCESS = 1;
public static final int ERROR = 0;
private int state;
private String message;
private T data;
public JsonResult() {
}
public JsonResult(int state, String message) {
this.state = state;
this.message = message;
}
public JsonResult(Throwable e) {
this.state = ERROR;
this.message = e.getMessage();
}
public JsonResult(T data) {
this.state = SUCCESS;
this.data = data;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "JsonResult [state=" + state + ", message=" + message + ", data=" + data + "]";
}
}
package cn.tedu.web;
import java.lang.reflect.Field;
import org.springframework.stereotype.Component;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import cn.tedu.util.JsonResult;
@Component
public class ExceptionInterceptor implements Interceptor{
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation ai) throws Exception {
Object action=ai.getAction();
try {
String value=ai.invoke();//调用控制器
return value;
}catch(Exception e) {
//action.result=new JsonResult(e);
Class cls=action.getClass();
//利用反射找到result属性
try {
Field fld=cls.getDeclaredField("result");
//修改私有属性result的值
fld.setAccessible(true);
fld.set(action,new JsonResult(e));
return "json";
}catch(Exception ex){
//如果没有result属性就不在处理异常了
ex.printStackTrace();
throw e;
}
}
}
}
sppring-hibernate
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
default-lazy-init="true"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.1.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<!-- spring-hibernate.xml -->
<!-- 配置数据源,连接到数据库,替代了hibernate的主配置文件 hibernate.xfg.xml -->
<!-- 读取properties -->
<util:properties id="conf" location="classpath:conf/conf.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="#{conf.driver}"/>
<property name="url" value="#{conf.url}"/>
<property name="username" value="#{conf.username}"/>
<property name="password" value="#{conf.password}"/>
<property name="initialSize" value="#{conf.initialSize}"/>
<property name="maxActive" value="#{conf.maxActive}"/>
<property name="minIdle" value="#{conf.minIdle}"/>
<property name="maxWait" value="#{conf.maxWait}"/>
<property name="timeBetweenLogStatsMillis" value="#{conf.timeBetweenLogStatsMillis}"/>
</bean>
<!-- 利用spring-orm 提供的工厂Bean创建SessionFactory 对象 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 配置数据源,使hibernate能够连接到数据库 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置hibernate工作参数,包括SQL方言 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 配置“子映射”文件的存储位置 -->
<property name="mappingLocations">
<value>classpath:hbm/*.xml</value>
</property>
</bean>
<!-- Spring提供了hibernateTemplate封装了Session,提供了与Session
几乎一样的功能,但是使用此session更简单 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置hibernate 事务管理器 -->
<bean id="txMgr" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 开启基于注解的声明式事务管理 -->
<tx:annotation-driven transaction-manager="txMgr"/>
<context:component-scan base-package="cn.tedu.dao"/>
</beans>
spring-struts
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
default-lazy-init="true"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<context:component-scan base-package="cn.tedu.action"/>
<context:component-scan base-package="cn.tedu.web"/>
</beans>
user.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 定义了 类和表的对应关系 -->
<class name="cn.tedu.entity.User"
table="t_user">
<!-- 定义属性和列(字段)的对应关系 -->
<id name="id" column="u_id">
<!-- <generator class="org.hibernate.id.IncrementGenerator"></generator> -->
<generator class="identity"></generator>
</id>
<property name="name" column="u_name"/>
<property name="password" column="u_password"/>
<property name="age" column="u_age"/>
<property name="salary" column="u_salary"/>
<property name="hiredate" column="u_hiredate"/>
</class>
</hibernate-mapping>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 从 struts-2.5.dtd 文件中复制 DOCTYPE -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.action.extension"
value="do"/>
<package name="user" namespace="/user"
extends="json-default">
<!-- 登记拦截组件 -->
<interceptors>
<interceptor name="exp"
class="exceptionInterceptor">
</interceptor>
<interceptor-stack name="allStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="exp"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="allStack"></default-interceptor-ref>
<global-results>
<result type="json" name="json">
<param name="root">result</param>
</result>
</global-results>
<action name="list" class="userAction"
method="list"></action>
<action name="save" class="userAction"
method="save"></action>
<action name="load" class="userAction"
method="load">
</action>
<action name="update" class="userAction"
method="update"></action>
</package>
<package namespace="/u" name="u" extends="json-default">
<action name="list" class="usrAction" method="list">
<result name="success">
/WEB-INF/jsp/list.jsp
</result>
</action>
</package>
</struts>
页面