模型:
1web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>springMVC1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- Spring配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/springAnnotation-*.xml</param-value>
</context-param>
<!-- Spring监听 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- SpringMVC配置 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- contextConfigLocation是个固定的参数 -->
<param-name>contextConfigLocation</param-name>
<!-- 加载配置文件 -->
<param-value>classpath*:config/springAnnotation-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 中文编码UTF-8,针对response响应和request的请求 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--当hibernate+spring配合使用的时候,如果设置了lazy=true,那么在读取数据的时候,当读取了父数据后,
hibernate 会自动关闭session,这样,当要使用子数据的时候,系统会抛出lazyinit的错误,
这时就需要使用spring提供的 OpenSessionInViewFilter, OpenSessionInViewFilter主要是保持Session状态
直到request将全部页面发送到客户端,这样就可以解决延迟加载带来的问题 -->
<filter>
<filter-name>openSession</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSession</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
springAnnotation-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 这是另外一种开启注解的方式
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
-->
<!-- 继承MultiActionController来实现根据参数名指定要请求的方法
配置url映射到相应的类
<bean name="/test/hello" class="com.zhou.web.controller.MultiController">
<property name="methodNameResolver">
配置参数方法名,也就是调用什么方法,具体的看22行的配置
<ref bean="paramMethodResolver"/>
</property>
</bean>
配置参数方法名,也就是调用什么方法
<bean id="paramMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="method"></property>
</bean>
-->
<!--controller层实现Controller接口
配置url映射的类
<bean name="/test/hello1" class="com.zhou.web.controller.HelloWorld" />
-->
<!-- 注解扫描包 -->
<context:component-scan base-package="com.zhou.web.controller" />
<!-- 开启注解 -->
<mvc:annotation-driven/>
<!-- 静态资源访问 -->
<!-- mapping:映射,location:本地资源路径,一定要是webapp根目录下,注意必须是webapp根目录下的路径。 **,它表示映射/img/下的所有文件 -->
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 配置上传文件-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!--最大上传大小单位字节-->
<property name="maxUploadSize" value="10485760000" />
<!--最大缓存字节-->
<property name="maxInMemorySize" value="40960" />
</bean>
</beans>
springAnnotation-hibernate.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
<!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">
]>
<!-- hibernate5个对象-->
<!-- configLocations,sessionFactory,session ,transaction,Query-->
<beans>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 指定连接数据库的驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<!-- 指定连接数据库的URL -->
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<!-- 指定连接数据库的用户名 -->
<property name="username" value="root"/>
<!-- 指定连接数据库的密码 -->
<property name="password" value="root"/>
</bean>
<!--配置数据库会话工厂-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 引用数据源 -->
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<!-- hibernate属性配置 -->
<props>
<!-- 指定一种方言, 允许Hibernate针对特定的关系数据库生成优化的SQL -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<!--hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构 -->
<!-- 在SessionFactory创建时,自动检查数据库结构,或者将数据库schema的DDL导出到数据库. 使用 create-drop时,在显式关闭SessionFactory时,将drop掉数据库schema.
取值 validate | update | create | create-drop -->
<!-- update:第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),
以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。
要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。-->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!--输出所有SQL语句到控制台 -->
<prop key="hibernate.show_sql">true</prop>
<!--在log和console中打印出更漂亮的SQL。 取值 true | fals-->
<prop key="hiberante.format_sql">true</prop>
</props>
</property>
<property name="configLocations">
<list>
<value>
<!--配置映射的类-->
classpath*:config/hibernateBean/hibernate.cfg.bean.xml
</value>
</list>
</property>
</bean>
<!-- 配置事务容器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<props>
<!--配置事务的方法 -->
<!-- 定义事务规则 定义当遇到Exception异常时 回滚,- 表示抛出该异常时并回滚,+表示即使抛出该异常事务同样要提交-->
<!-- PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 -->
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<!-- PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常 -->
<prop key="get*">PROPAGATION_NEVER</prop>
</props>
</property>
</bean>
</beans>
springAnnotation-core.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
<!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">
]>
<beans>
<!-- 引入需要初始化的bean -->
<import resource="classpath*:config/bean/springAnnotation-bean.xml"/>
</beans>
springAnnotation-bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
<!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">
]>
<beans>
<!-- 配置相应的bean ,配置完就自动实例化,实例化对象可以通过注解调用,调用规则是id-->
<bean id="userDao" class="com.zhou.web.dao.UserDAOImpl">
<!-- 引用数据库session工程 -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userService" class="com.zhou.web.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!--parent="transactionBese" 继承transactionBese(事务管理) -->
<!--ref="userManagerBase"" 实现userService -->
<!--userServiceTrans :该bean 是引用id=userService,实现UserServiceImpl,继承数据库配置的事务id=transactionBese-->
<bean id="userServiceTrans" parent="transactionBese">
<property name="target" ref="userService"></property>
</bean>
</beans>
hibernate.cfg.bean.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="com.zhou.web.entity.User"/>
</session-factory>
</hibernate-configuration>
*dao:基本增删改查*
package com.zhou.web.dao;
import java.util.List;
import com.zhou.web.entity.User;
public interface UserDAO {
// 添加用户
public void addUser(User user);
// 查询用户
public List<User> getAllUser();
// 删除用户
public boolean delUser(String id);
// 修改用户
public boolean updateUser(User user);
}
package com.zhou.web.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import com.zhou.web.entity.User;
public class UserDAOImpl implements UserDAO {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public void addUser(User user) {
sessionFactory.getCurrentSession().save(user);
}
@Override
public List<User> getAllUser() {
String hql = "from User";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
return query.list();
}
@Override
public boolean delUser(String id) {
String hql = "delete User u where u.id=?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setString(0, id);
return (query.executeUpdate() > 0);
}
@Override
public boolean updateUser(User user) {
String hql = "update User u set u.userName=?,u.age=? where u.id=?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setString(0, user.getUserName());
query.setString(1, user.getAge());
query.setString(2, user.getId());
return (query.executeUpdate() > 0);
}
}
service
package com.zhou.web.service;
import java.util.List;
import com.zhou.web.entity.User;
public interface UserService {
// 添加用户
public void addUser(User user);
// 查询用户
public List<User> getAllUser();
// 删除用户
public boolean delUser(String id);
// 修改用户
public boolean updateUser(User user);
}
package com.zhou.web.service;
import java.util.List;
import com.zhou.web.dao.UserDAO;
import com.zhou.web.entity.User;
public class UserServiceImpl implements UserService {
private UserDAO userDao;
public void setUserDao(UserDAO userDao) {
this.userDao = userDao;
}
@Override
public void addUser(User user) {
userDao.addUser(user);
}
@Override
public List<User> getAllUser() {
return userDao.getAllUser();
}
@Override
public boolean delUser(String id) {
return userDao.delUser(id);
}
@Override
public boolean updateUser(User user) {
return userDao.updateUser(user);
}
}
controller
package com.zhou.web.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.zhou.web.entity.User;
import com.zhou.web.service.UserService;
@Controller
@RequestMapping("/user")
public class UserController {
//相当于UserService UserService=new UserServiceImpl();
//User是个接口,UserServiceImpl是IUser接口的实现类,UserServiceImpl已经在配置文件配置bean了
//注解引入实例化对象
@Resource(name="userServiceTrans")
private UserService userServiceTrans;
@RequestMapping("/addUser")
public String addUser(User user){
System.out.println("1111111");
userServiceTrans.addUser(user);
return "redirect:/user/getAllUser";
}
@RequestMapping("/getAllUser")
public String getAllUser(HttpServletRequest request){
List<User> user = userServiceTrans.getAllUser();
request.setAttribute("user", user);
return "/userList";
}
@RequestMapping("/delUser")
public void delUser(String id,HttpServletResponse response){
String result = "{\"result\":\"error\"}";
if(userServiceTrans.delUser(id)){
result = "{\"result\":\"success\"}";
}
PrintWriter out = null;
response.setContentType("application/json");
try {
out = response.getWriter();
out.write(result);
} catch (IOException e) {
e.printStackTrace();
}
// return "redirect:/user/getAllUser";
}
@RequestMapping("/updateUser")
public String updateUser(User user,HttpServletResponse response) {
String result = "{\"result\":\"error\"}";
if(userServiceTrans.updateUser(user)){
result = "{\"result\":\"success\"}";
}
PrintWriter out = null;
response.setContentType("application/json");
try {
out = response.getWriter();
out.write(result);
} catch (IOException e) {
e.printStackTrace();
}
return "redirect:/user/getAllUser";
}
}
entity
package com.zhou.web.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
//实体User映射到表T_USER
@Entity
@Table(name="T_USER")
public class User {
@Id //数据库中的主键生成器,值为uuid
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(length=32)
private String id;//id
@Column(length=32)
private String userName;//用户名
@Column(length=32)
private String age;//年龄
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
列表页面
<script type="text/javascript">
function del(id){
$.get("/springMVC1/user/delUser?id=" + id,function(data){
if("success" == data.result){
window.location.reload();
}else{
alert("删除失败!")
}
});
}
</script>
</head>
<body>
<body>
<tr>
<td><th>id</th> </td>
<td><th>姓名</th></td>
<td><th>年龄</th></td>
<td><th>编辑</th></td>
<td><th> <a href="../addUser.jsp">添加</a></th></td>
</tr>
<c:if test="${!empty user }">
<c:forEach items="${user }" var="u">
<form name="userForm" action="/springMVC1/user/updateUser">
<tr><td><th><input type="text" name="id" value="${u.id }"><th></td>
<td><th><input type="text" name="userName" value="${u.userName }"><th></td>
<td><th><input type="text" name="age" value="${u.age }"><th></td>
<td><th>
<input type="submit" name="submit" value="修改">
<a href="javascript:del('${u.id }')">删除</a><th>
</td>
</tr>
</form>
</c:forEach>
</c:if>
</body>
</body>
添加页面
<script type="text/javascript">
function addUser(){
var form = document.forms[0];
form.action="/springMVC1/user/addUser";
form.method="post";
form.submit();
}
</script>
</head>
<body>
<h>添加用户</h>
<form name="userForm" action="">
姓名:<input type="text" name="userName">
年龄:<input type="text" name="age">
<input type="button" value="添加" onclick="addUser()">
</form>