SpringMVC又一个漂亮的web框架,他与Struts2并驾齐驱,Struts出世早而占据了一定优势,我在博客《Struts1+Hibernate+Spring整合实例》中做了一个简单的实例,介绍了SSH1的基本搭建方式,Struts2是根据Struts1发展而来,博客中就没有贴SSH2的例子,只对比了下Struts1和Struts2异同,通过对比,SSH2的搭建基本不在话下了。下面同样做一个简单的应用实例,介绍SpringMVC的基本用法,接下来的博客也将梳理一下Struts2和SpringMVC的一些异同,通过梳理和旧知识的联系,让学习的成本变低,花很短的时间就可以了解一门貌似新的技术,其实本质没变。
下面开始实例,这个实例的需求是对用户信息进行增删改查。首先创建一个web项目test_ssh,目录结构及需要的Jar包如下图:
创建一个User实体类,放在Entity包下,采用注解的方式:
package com.tgb.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;
@Entity
@Table(name="T_USER")
public class User {
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name = "system-uuid",strategy="uuid")
@Column(length=32)
private String id;
@Column(length=32)
private String userName;
@Column(length=32)
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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;
}
}
本篇关于SpringMVC基本都会采用注解的方式,首先配置好数据源以及事务spring-common.xml,放在config.spring包下:
org.hibernate.dialect.MySQLDialect
update
true
true
com.tgb.entity.User
PROPAGATION_REQUIRED,-Exception
PROPAGATION_REQUIRED,-myException
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
然后配置关于SpringMVC的内容,下面配置中都有注释说明,就不再赘述,spring-mvc.xml放在config.spring包下:
完成这些共用的配置之后,来配置web项目起点web.xml:
json_test
login.jsp
contextConfigLocation
classpath*:config/spring/spring-*.xml
org.springframework.web.context.ContextLoaderListener
springMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:config/spring/spring-mvc.xml
1
springMVC
/
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
openSession
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
openSession
/*
读者需自行下载jquery包,放到webContent文件夹下的js包下。然后创建几个测试页面,分别如下:
Login.jsp,项目的入口界面。
[html] view plaincopy
进入用户管理页
Index.jsp,用户管理的主界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Insert title here
添加用户
姓名
年龄
操作
${user.userName }
${user.age }
编辑
删除
addUser.jsp,添加用户界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
添加用户
editUser.jsp,修改用户信息界面。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Insert title here
编辑用户
还有success.jsp和error.jsp页面,无代码,就不再展示。
框架越来越多,越来越好用,但随之而来的繁杂的、各成体系的配置怎么办?项目大了感觉注解靠谱些。
这篇接着上篇,把没贴完的代码写完,上篇主要完成了一些公共配置和界面的东西,这篇把后台的代码完成。
首先是web包下属于的control层的类UserController,这相当于Struts中的Action,是重要的类:
package com.tgb.web;
import java.io.IOException;
import java.io.PrintWriter;
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.tgb.entity.User;
import com.tgb.manager.UserManager;
@Controller
@RequestMapping("/user")
public class UserController {
@Resource(name="userManager")
private UserManager userManager;
@RequestMapping("/getAllUser")
public String getAllUser(HttpServletRequest request){
request.setAttribute("userList", userManager.getAllUser());
return "/index";
}
@RequestMapping("/getUser")
public String getUser(String id,HttpServletRequest request){
request.setAttribute("user", userManager.getUser(id));
return "/editUser";
}
@RequestMapping("/toAddUser")
public String toAddUser(){
return "/addUser";
}
@RequestMapping("/addUser")
public String addUser(User user,HttpServletRequest request){
userManager.addUser(user);
return "redirect:/user/getAllUser";
}
@RequestMapping("/delUser")
public void delUser(String id,HttpServletResponse response){
String result = "{\"result\":\"error\"}";
if(userManager.delUser(id)){
result = "{\"result\":\"success\"}";
}
response.setContentType("application/json");
try {
PrintWriter out = response.getWriter();
out.write(result);
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("/updateUser")
public String updateUser(User user,HttpServletRequest request){
if(userManager.updateUser(user)){
user = userManager.getUser(user.getId());
request.setAttribute("user", user);
return "redirect:/user/getAllUser";
}else{
return "/error";
}
}
}
然后是属于manager包下的业务逻辑类,接口UserManager:
package com.tgb.manager;
import java.util.List;
import com.tgb.entity.User;
public interface UserManager {
public User getUser(String id);
public List getAllUser();
public void addUser(User user);
public boolean delUser(String id);
public boolean updateUser(User user);
}
实现类UserManagerImpl:
package com.tgb.manager;
import java.util.List;
import com.tgb.dao.UserDao;
import com.tgb.entity.User;
public class UserManagerImpl implements UserManager {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public User getUser(String id) {
return userDao.getUser(id);
}
@Override
public List getAllUser() {
return userDao.getAllUser();
}
@Override
public void addUser(User user) {
userDao.addUser(user);
}
@Override
public boolean delUser(String id) {
return userDao.delUser(id);
}
@Override
public boolean updateUser(User user) {
return userDao.updateUser(user);
}
}
最后是属于dao包底下的DAO层,主要由Hibernate完成。接口UserDao:
package com.tgb.dao;
import java.util.List;
import com.tgb.entity.User;
public interface UserDao {
public User getUser(String id);
public List getAllUser();
public void addUser(User user);
public boolean delUser(String id);
public boolean updateUser(User user);
}
实现类UserDaoImpl:
package com.tgb.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import com.tgb.entity.User;
public class UserDaoImpl implements UserDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public User getUser(String id) {
String hql = "from User u where u.id=?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setString(0, id);
return (User)query.uniqueResult();
}
@Override
public List getAllUser() {
String hql = "from User";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
return query.list();
}
@Override
public void addUser(User user) {
sessionFactory.getCurrentSession().save(user);
}
@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);
}
}
最后外加一个配置spring-beans.xml,放在config.spring包下,负责为各层依赖注入需要的对象:
到此为止,所有的配置和代码完成,部署—运行,运行结果如下图:
这个小实例结束,下篇将对SpringMVC和Struts2做一个对比。