在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。个人也不喜欢配置那么多的xml文件。下面我们就利用java的注解实现ssh框架,注解相当于一种标记加了注解就等于打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具包和其他程序可以用反射来了解你的类以及各种元素上有何种标记,看你有什么标记,就去干相应的事,标记可以加载包,类,字段,方法,方法的参数以及局部变量上。关于注解在这里不多说,网上大把资料。
先看看完整的工程目录吧
1.为了使用注解我们需要配置web.xml文件,在web-inf目录下内容如下
contextConfigLocation
classpath*:applicationContext*.xml
org.springframework.web.context.ContextLoaderListener
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
actionPackages
com.ssh
struts2
/*
index.jsp
2.接下来看看spring和hibernate的配置文件applicationContext.xml
org.hibernate.dialect.MySQLDialect
true
update
com.ssh.*
基本都有注释了,这里不多说了,需要注意的是如果是自己搞回去用千万记得要改上面的数据库配置。
3.接下来我们再看看struts的配置文件struts.xml
基本上注释写的很详细了吧,我也不是很懂就那样配置着先....
接下来我们就可以安心的写java代码了,先创建如下图所示的包和类
先看看实体类User.java
package com.ssh.user.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* 类名称:User
* 类描述:用户信息实体
* 创建人:anan
* 创建时间:2012-12-21 下午10:55:19
* 修改人:anan
* 修改时间:2012-12-21 下午10:55:19
* 修改备注:
* @version
* */
@Entity
@Table(name = "user")
public class User {
/**
* 用户id
*/
@Id
@Column(name = "userId")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int userId;
/**
* 用户名
*/
@Column(name = "userName", length = 50)
private String userName;
/**
* 用户登录密码
*/
@Column(name = "passWord", length = 50)
private String passWord;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public User(int userId, String userName, String passWord) {
this.userId = userId;
this.userName = userName;
this.passWord = passWord;
}
public User(String userName, String passWord) {
this.userName = userName;
this.passWord = passWord;
}
public User(int userId) {
this.userId = userId;
}
public User() {
}
}
这是一个基本的pojo类,关键看看那几个注解@Entity表示当前类是一个实体,@Table(name = "user")指定这个类映射到数据库的哪一个表,@Column(name = "userId")表示这个属性映射数据库对应表中的那一列...
接下来看看UserDao.java
package com.ssh.user.dao;
import java.util.List;
import com.ssh.user.model.User;
/**
* 类名称:UserDao
* 类描述:用户控制dao实现数据库操作接口
* 创建人:anan
* 创建时间:2012-12-21 下午11:05:46
* 修改人:anan
* 修改时间:2012-12-21 下午11:05:46
* 修改备注:
* @version
* */
public interface UserDao {
public void addUser(User user);
public void delUser(int userId);
public void updateUser(User user);
public List selectUser();
public User getUserByUserId(int userId);
public boolean isExitByName(String userName);
public boolean isExitByNameAndPass(User user);
}
这是一个接口指定用户操作,定义一些方法
接下来具体实现这些方法,看UserDaoImpl.java
package com.ssh.user.dao.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.stereotype.Repository;
import com.ssh.user.dao.UserDao;
import com.ssh.user.model.User;
import com.ssh.util.MyHibernateDaoSupport;
/**
* 类名称:UserDaoImpl
* 类描述:用户控制dao实现数据库操作接口实现
* 创建人:anan
* 创建时间:2012-12-21 下午11:07:43
* 修改人:anan
* 修改时间:2012-12-21 下午11:07:43
* 修改备注:
* @version
* */
@Repository("userDao")
public class UserDaoImpl extends MyHibernateDaoSupport implements UserDao{
public void addUser(User user) {
Session session = this.getSession(true);
Transaction tc = (Transaction) session.beginTransaction();
session.save(user);
try {
tc.commit();
} catch (Exception e) {
e.printStackTrace();
}
session.close();
}
public void delUser(int userId) {
Session session = this.getSession(true);
Transaction tc = (Transaction) session.beginTransaction();
User u = new User(userId);
session.delete(u);
try {
tc.commit();
} catch (Exception e) {
e.printStackTrace();
}
session.close();
}
public void updateUser(User user) {
Session session = this.getSession(true);
Transaction tc = (Transaction) session.beginTransaction();
session.update(user);
try {
tc.commit();
} catch (Exception e) {
e.printStackTrace();
}
session.close();
}
public List selectUser() {
List users = new ArrayList();
Session session = this.getSession(true);
Transaction tc = (Transaction) session.beginTransaction();
List list = session.createQuery("From User").list();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
User u = (User) iterator.next();
users.add(u);
}
try {
tc.commit();
} catch (Exception e) {
e.printStackTrace();
}
session.close();
return users;
}
public User getUserByUserId(int userId) {
Session session = this.getSession(true);
Transaction tc = (Transaction) session.beginTransaction();
//load 是说明数据库中一定存在这条记录,没有则报出:ObjectNotFoundException
//get 如果查不到记录,返回的是一个null
User user = (User)session.load(User.class, userId);
try {
tc.commit();
} catch (Exception e) {
e.printStackTrace();
}
session.close();
return user;
}
public boolean isExitByName(String userName) {
Session session = this.getSession(true);
Transaction tc = (Transaction) session.beginTransaction();
List user = (List)session.createQuery("From User u where u.userName=:userName").setString("userName", userName).list();
if(user.size()>0){
try {
tc.commit();
} catch (Exception e) {
e.printStackTrace();
}
session.close();
return true;
}
try {
tc.commit();
} catch (Exception e) {
e.printStackTrace();
}
session.close();
return false;
}
public boolean isExitByNameAndPass(User user) {
Session session = this.getSession(true);
Transaction tc = (Transaction) session.beginTransaction();
List users = (List)session.createQuery("From User u where u.userName=:userName and u.passWord=:passWord").setString("userName", user.getUserName()).setString("passWord", user.getPassWord()).list();
if(users.size()>0){
try {
tc.commit();
} catch (Exception e) {
e.printStackTrace();
}
session.close();
return true;
}
try {
tc.commit();
} catch (Exception e) {
e.printStackTrace();
}
session.close();
return false;
}
}
到这里数据库操作基本搞完,接下来写业务逻辑代码,先看看UserService.java
package com.ssh.user.service;
import java.util.List;
import com.ssh.user.model.User;
/**
* 类名称:UserService
* 类描述:用户业务逻辑接口
* 创建人:anan
* 创建时间:2012-12-21 下午10:58:32
* 修改人:anan
* 修改时间:2012-12-21 下午10:58:32
* 修改备注:
* @version
* */
public interface UserService {
/**
* 判断用户是否存在
* @param userName
* @return user
* @
* */
public boolean isExitUser(String userName) ;
/**
* 判断用户是否存在
* @param userName passWord
* @return user
* @
* */
public boolean isExitByNameAndPass(User user) ;
/**
* 保存用户
* @param user
* @return boolean
* @
* */
public void save(User user) ;
/**
* 查询所有用户
* @param
* @return List
* @
* */
public List getUsers() ;
/**
* 删除用户
* @param userId
* @return
* @
* */
public void del(int userId) ;
/**
* 修改用户
* @param user
* @return
* @
* */
public void update(User user) ;
/**
* 根据id获得user
* @param userId
* @return user
* @
* */
public User getUserById(int userId) ;
}
这个只是一个接口,定义我们接下来需要的方法。下面是具体的实现类UserServiceImpl.java
package com.ssh.user.service.Impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.ssh.user.dao.UserDao;
import com.ssh.user.model.User;
import com.ssh.user.service.UserService;
/**
* 类名称:UserServiceImpl
* 类描述:用户信息操作业务逻辑接口实现
* 创建人:anan
* 创建时间:2012-12-21 下午11:08:18
* 修改人:anan
* 修改时间:2012-12-21 下午11:08:18
* 修改备注:
* @version
* */
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
public boolean isExitUser(String userName) {
return userDao.isExitByName(userName);
}
public void save(User user) {
userDao.addUser(user);
}
public List getUsers() {
List users = userDao.selectUser();
return users;
}
public void del(int userId) {
userDao.delUser(userId);
}
public void update(User user) {
userDao.updateUser(user);
}
public User getUserById(int userId) {
return userDao.getUserByUserId(userId);
}
public boolean isExitByNameAndPass(User user) {
return userDao.isExitByNameAndPass(user);
}
}
业务逻辑在这里包括了判断用户是否存在,保存用户信息,获取用户信息,删除用户,更新用户信息等
通过上面两个类业务逻辑层也就完成了,接下来写视图控制器,这里只是写了一个简单的登录控制器LoginAction.java
package com.ssh.user.action;
import javax.annotation.Resource;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;
import com.ssh.user.dao.UserDao;
import com.ssh.user.model.User;
/**
* 类名称:LoginAction
* 类描述:用户控制器的实现
* 创建人:anan
* 创建时间:2012-12-21 下午11:17:36
* 修改人:anan
* 修改时间:2012-12-21 下午11:17:36
* 修改备注:
* @version
* */
@Action(value = "loginAction", results = {
@Result(name = "loginSuccess", location = "/loginSuss.jsp"),
@Result(name = "loginFailer", location = "/loginFailer.jsp") })
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = -2266695172069461659L;
@Resource
private UserDao userDao;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String login(){
boolean flag = userDao.isExitByNameAndPass(user);
if(flag){
return "loginSuccess";
}
return "loginFailer";
}
}
这个就是控制层。
再写几个jsp文件来测试一下
内容如下:
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'index.jsp' starting page
loginFailer.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'loginFailer.jsp' starting page
登录失败
loginSuss.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'loginSuss.jsp' starting page
登录成功
启动tomcat我们可以看到数据库自动生成一个user表。我们添加一条记录为下面测试
接下来打开浏览器,输入http://localhost:8080/ssh/可以看到下图页面就可以测试了
觉得使用了ssh结构之后整个工程的层次感就那样出来了。搞鼓一下收获还是蛮大的,基于注解的ssh是比xml方便很多,看大家喜欢吧
源码下地址
http://download.csdn.net/detail/yunji3344/4915649