1、新建一个mysql数据库,并新建连接,数据库结构如下图所示:
2、新建一个项目,包结构如下图:
3、导入框架所需的jar文件,从下面网址下载:
http://ishare.iask.sina.com.cn/f/14550905.html?from=like&retcode=0
或:
http://download.csdn.net/detail/caozhongde1991/3496608
4、在book.model包中,由数据库生成实体类:
如果没有建好数据源,则需要新建数据源。
package book.model;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@Table(name = "admin")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Admin.findAll", query = "SELECT a FROM Admin a"),
@NamedQuery(name = "Admin.findByUName", query = "SELECT a FROM Admin a WHERE a.uName = :uName"),
@NamedQuery(name = "Admin.findByUPass", query = "SELECT a FROM Admin a WHERE a.uPass = :uPass"),
@NamedQuery(name = "Admin.findByUId", query = "SELECT a FROM Admin a WHERE a.uId = :uId")})
public class Admin implements Serializable {
private static final long serialVersionUID = 1L;
@Size(max = 20)
@Column(name = "u_Name")
private String uName;
@Size(max = 20)
@Column(name = "u_Pass")
private String uPass;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "u_id")
private Integer uId;
public Admin() {
}
public Admin(Integer uId) {
this.uId = uId;
}
public String getUName() {
return uName;
}
public void setUName(String uName) {
this.uName = uName;
}
public String getUPass() {
return uPass;
}
public void setUPass(String uPass) {
this.uPass = uPass;
}
public Integer getUId() {
return uId;
}
public void setUId(Integer uId) {
this.uId = uId;
}
@Override
public int hashCode() {
int hash = 0;
hash += (uId != null ? uId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Admin)) {
return false;
}
Admin other = (Admin) object;
if ((this.uId == null && other.uId != null) || (this.uId != null && !this.uId.equals(other.uId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "book.model.Admin[ uId=" + uId + " ]";
}
}
5、新建持久性单元,persisternce.xml:
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="sshjPU" >
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>book.model.Admin</class>
<properties/>
</persistence-unit>
</persistence>
6、在book.idao包中,新建dao接口IBaseDao和IAdminDao:
为了应用程序的扩展,创建IBaseDao接口:
package book.idao;
import java.io.Serializable;
import java.util.List;
public interface IBaseDao<T,ID extends Serializable>{
void insert(T obj);
void update(T obj);
void delete(ID id);
T findById(ID id);
List<T> findAll();
List<T> findPage(int pageSize,int pageNo);
int findCount();
}
IAdminDao接口继承了IBaseDao接口:
package book.idao;
import book.model.Admin;
import java.util.List;
public interface IAdminDao extends IBaseDao<Admin,Integer>{
Admin findOne(String Name,String Password);
List<Admin> findPage(String Name,Integer pageSize,Integer pageNo);
Integer findCount(String Name);
}
7、在book.dao包中,实现dao接口IBaseDao和IAdminDao,创建类BaseDao和AdminDao:
为了应用程序的扩展,BaseDao类实现了大量有用的方法,注意添加事务标注@Transactional,实现事务注入。在private EntityManager em语句前添加标注@PersistenceContext,实现实体管理器的自动注入。
package book.dao;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import book.idao.IBaseDao;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class BaseDao <T,ID extends Serializable> implements IBaseDao<T,ID>{
@PersistenceContext
private EntityManager em;
private Class<T> cls;
public BaseDao(Class<T> cls){
this.cls=cls;
}
@Override
public void insert(T obj){
em.persist(obj);
}
@Override
public void update(T obj){
em.merge(obj);
}
@Override
public void delete(ID id){
em.remove(findById(id));
}
@Override
public T findById(Serializable id){
if((T)em.find(cls,id)==null)
return null;
else
return (T)em.find(cls,id);
}
@Override
public List<T> findAll(){
return em.createQuery("select o from"+
cls.getSimpleName()+"as o").getResultList();
}
@Override
public List<T> findPage(int pageSize,int pageNo){
Query q=em.createQuery("select o from"+
cls.getSimpleName()+"as o");
q.setMaxResults(pageSize);
q.setFirstResult((pageNo-1)*pageSize);
return q.getResultList();
}
@Override
public int findCount(){
return ((Long)em.createQuery("select o from"+
cls.getSimpleName()+"as o").getSingleResult()).intValue();
}
//根据jpql查询一条记录
protected T findOne(String jpql,Object... values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
if((T)q.getSingleResult()==null)
return null;
else
return (T)q.getSingleResult();
}
//根据jpql分页查询多条记录
protected List<T> findPage(String jpql,int pageSize,int pageNo,Object...values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
q.setMaxResults(pageSize);
q.setFirstResult((pageNo-1)*pageSize);
return q.getResultList();
}
//根据jpql不分页查询多条记录
protected List<T> find(String jpql,Object...values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
return q.getResultList();
}
//根据jpql查询前num条记录
protected List<T> findTopByNum(String jpql,int num,Object... values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
q.setMaxResults(num);
return q.getResultList();
}
//根据jpql查询记录总数
protected int findCount(String jpql,Object... values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
return ((Long)q.getSingleResult()).intValue();
}
//根据jpql执行更新或删除,返回被影响的记录总数
protected int excute(String jpql,Object...values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
return q.executeUpdate();
}
}
8、在book.iservice包中,新建业务逻辑接口IAdminService:
本接口也是为了扩展,添加了许多方法的定义。
package book.iservice;
import book.model.Admin;
import java.util.List;
public interface IAdminService {
void addAdmin(Admin admin);
void deleteAdmin(Integer Id);
Admin findAdminById(Integer Id);
Admin findAdmin(String Name,String Password);
List<Admin> findAdminByPage(Integer pageSize,Integer pazeNo);
Integer findCount(String Name);
}
9、在book.service包中,实现业务逻辑接口IAdminService,创建类AdminService:
类AdminService中采用标注@Autowired,对private IAdminDao iAdminDao;进行自动注入。
package book.service;
import book.idao.IAdminDao;
import book.iservice.IAdminService;
import book.model.Admin;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
public class AdminService implements IAdminService{
@Autowired
private IAdminDao iAdminDao;
@Override
public void addAdmin(Admin admin) {
iAdminDao.insert(admin);
}
@Override
public void deleteAdmin(Integer custId) {
iAdminDao.delete(custId);
}
@Override
public Admin findAdminById(Integer custId) {
return iAdminDao.findById(custId);
}
@Override
public Admin findAdmin(String Name, String Password) {
return iAdminDao.findOne(Name, Password);
}
@Override
public List<Admin> findAdminByPage(Integer pageSize, Integer pazeNo) {
return iAdminDao.findPage(pageSize, pazeNo);
}
@Override
public Integer findCount(String Name) {
return iAdminDao.findCount(Name);
}
}
10、修改web.xml文件:
<?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">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
</web-app>
11、添加applicationContext.xml文件,整合spring框架和hibernateJPA框架:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--以下Service采用自动注入-->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<!--在Dao层使用@PersistenceContext注入实体管理器-->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="sshjPU"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="generateDdl" value="true"/>
<property name="showSql" value="false"/>
</bean>
</property>
</bean>
<bean id="iAdminDao" class="book.dao.AdminDao"/>
<bean id="iAdminService" class="book.service.AdminService"/>
<bean id="myTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory">
<ref bean="entityManagerFactory"/>
</property>
</bean>
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(* book.service.*.*())"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="myTxManager">
<tx:attributes >
<tx:method name="add*" propagation="REQUIRES_NEW"/>
<tx:method name="edit*" propagation="REQUIRES_NEW"/>
<tx:method name="delect*" propagation="REQUIRES_NEW"/>
<tx:method name="find*" propagation="REQUIRED" read-only="true"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
</beans>
12、在WEB-INF文件夹下创建属性文件:jdbc.properties:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/book?useUnicode=true&chracterEncoding=gbk
jdbc.username=root
jdbc.password=123456
13、创建UserAction.java,实现struts2架构的MVC,注意添加标注@Autowired,实现自动注入:
package book.action;
import com.opensymphony.xwork2.ActionContext;
import book.iservice.IUserService;
import book.model.Admin;
public class UserAction {
private String userName;
private String userPassword;
private String msg;
@Autowired
private IAdminService iAdminService;
public String execute()throws Exception{
Admin user=iuserService.findByUsernameAndPassword(userName, userPassword);
if(user!=null){
msg="登录成功!"+user.getUName();
ActionContext.getContext().getSession().put("user",user);
}else{
msg="登录失败!<a href=\"JavaScript:window.history.back()\">返回</a>";
}
return "msg";
}
public void setUserName(String userName){
this.userName=userName;
}
public void setUserPassword(String userPassword){
this.userPassword=userPassword;
}
public String getMsg(){
return msg;
}
}
14、配置struts.xml文件:
<struts>
<package name="book" extends="struts-default">
<action name="UserAction" class="book.action.UserAction">
<result name="msg">/index.jsp</result>
</action>
</package>
</struts>
15、创建如下两个页面:
Login.jsp:
<%@ page pageEncoding="gb2312" %>
<%@ page contentType="text/html; charset=gb2312" %>
<% request.setCharacterEncoding("gb2312"); %>
<%@ page language="java" %>
<html>
<head><title>登录网页</title></head>
<body>
<form method="POST" action="UserAction.action">
<table >
<tr>
<td width="890" align="left" colspan="2">
<b><font size="5">系统登录</font></b>
<hr>
</td>
</tr>
<% if (request.getAttribute("error") != null){ %>
<tr>
<td width=100% align=center colspan=4 height=36>
<font color=red><b><%=request.getAttribute("error")%></b></font>
</td>
</tr>
<%
}
%>
<tr>
<td width="75" align="center">
<p align="right">账号:</p>
</td>
<td width="809" align="center">
<p align="left">
<input type="text" name="userName" size="20"></td>
</tr>
<tr>
<td width="75" align="center">
<p align="right">密码:</p>
</td>
<td width="809" align="center">
<p align="left">
<input type="password" name="userPassword" size="20">
<input type="submit" value="登录" name="loginButton"></td>
</tr>
</table>
</form>
</body>
</html>
在这个页面中,下面的form标记语句:
<form method="POST" action="UserAction.action">
表示该页面提交一个名为:"UserAction"的action,注意和struts.xml文件中的action的name相对应。
index.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>显示信息</title>
</head>
<body>
<h1>Hello World!</h1>
<div id="content">
<center>
<br/><%=request.getAttribute("msg")%>
</center>
</div>
</body>
</html>
该页面的标记语句:
<%=request.getAttribute("msg")%>
表示接收来自action的msg字符串。
16. 生成项目,并运行http://localhost:8080/sshj/login.jsp