1. 程式人生 > >使用Spring、Struts2、Hibernate三大框架實現使用者增刪改查

使用Spring、Struts2、Hibernate三大框架實現使用者增刪改查

這就是SSH框架內容很多,隨著下面一個案例來進入分析:

1 首先專案是依賴maven進行管理的,建立一個動態的web專案

2 在pom.xml匯入相關jar包,配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.wy</groupId>
  <artifactId>Struct</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>Struct Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  	<!-- Spring版本控制 -->
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring.version>4.3.11.RELEASE</spring.version>
	</properties>
  
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>2.5.2</version>
    </dependency>
    <!-- 資料庫 https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
	<dependency>
	    <groupId>commons-dbcp</groupId>
	    <artifactId>commons-dbcp</artifactId>
	    <version>1.2.2</version>
	</dependency>
    <!-- spring  https://mvnrepository.com/artifact/org.springframework/spring-orm -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-orm</artifactId>
	    <version>4.3.11.RELEASE</version>
	</dependency>
    
    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
            <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
            <version>4.3.11.RELEASE</version>
     </dependency>
   	<!-- mysql資料庫的驅動 -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.38</version>
	</dependency>
   	<!-- spring對jdbc的支援包 -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<!--  hibernate  https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
	<dependency>
	    <groupId>org.hibernate</groupId>
	    <artifactId>hibernate-core</artifactId>
	    <version>5.2.10.Final</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
	<dependency>
	    <groupId>org.hibernate</groupId>
	    <artifactId>hibernate-core</artifactId>
	    <version>5.2.10.Final</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.hibernate.common/hibernate-commons-annotations -->
	<dependency>
	    <groupId>org.hibernate.common</groupId>
	    <artifactId>hibernate-commons-annotations</artifactId>
	    <version>5.0.1.Final</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-spring-plugin -->
	<dependency>
	    <groupId>org.apache.struts</groupId>
	    <artifactId>struts2-spring-plugin</artifactId>
	    <version>2.5.12</version>
	</dependency>
	<!-- servlet 包,上線後不要,因為 tomcat的lib中自帶有, 所以要配置 scope為provided -->
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>javax.servlet-api</artifactId>
		<version>3.1.0</version>
		<scope>provided</scope>
	</dependency>
		<!-- spring容器 -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>${spring.version}</version>
	</dependency>

  </dependencies>
  <build>
    <finalName>Struct</finalName>
  </build>
</project>

3 建立簡單Student類,一般在開發中javabean放置在entity下,如com.yc.entity;持久層放在dao ,如com.yc.dao,業務層放在service,如com.yc.service ,控制層放置在controller,Student類如下(本案例的增刪改查是對Student):

package com.yc.entity;
public class Student {
	public int id ;
	public String name;
	public String pwd;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";
	}

}

Student在資料庫對應表示student:

create table student(
  id int primary key auto_increment,
  name varchar(20),
  pwd varchar(50) 
)

4 建立對映檔案,一般命名規則是類名.hbm.xml,因此對映檔案為Student.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="com.yc.entity.Student"   table="student">
    <id name="id" type="java.lang.Integer">
     <column name="id"/>
     <generator  class="native"/>
    </id>
    <property name="name" type="java.lang.String">
     <column  name="name" />
    </property>
     <property name="pwd" type="java.lang.String">
     <column  name="pwd" />
    </property>
  </class>
</hibernate-mapping>

5  編寫dao層介面,StudentDao:

package com.yc.dao;
import com.yc.entity.Student;
public interface StudentDao {
	//登入
	public int login(Student student);
	//註冊
	public int add(Student student);
	
	//修改
	public int update(Student student);
	
	//登出
	public int del(Student student);

}

6 實現Dao層介面,StudentDaoImpl:

package com.yc.dao.Impl;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.stereotype.Service;
import com.yc.dao.StudentDao;
import com.yc.entity.Student;
@Service
public class StudentDaoImpl  implements StudentDao {
	
	@Resource(name="sessionFactory")
	public SessionFactory sessionFactory;
  
	@Override
	public int login(Student student) {//登入操作
		
		Session session=sessionFactory.getCurrentSession();
		Query query=session.createQuery("from Student where name= ? and pwd= ?");
		query.setParameter(0,student.getName());//注入引數
		query.setParameter(1,student.getPwd());
		List<Student> list=query.list();
		System.out.println(list);
		if(list.size()>0&&list.get(0)!=null){
			return 1;  //返回1為成功
		}
		return 0; //返回0為失敗
	}

	@Override
	public int add(Student student) {  //註冊操作
	   try {
		Session session=sessionFactory.getCurrentSession();
		   Query query=session.createSQLQuery("insert  into (name,pwd) student values(?,?)").addEntity(Student.class);
		   query.setString(0,student.getName());
		   query.setString(1, student.getPwd());
		   session.save(student);
		   return 1;
	} catch (HibernateException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		return 0;
	}
	}

	@Override
	public int update(Student student) {   //修改操作
		 try {
				Session session=sessionFactory.getCurrentSession();
				Transaction  transAction=session.beginTransaction();
				   Query query=session.createSQLQuery("update student set pwd=? where name=? ").addEntity(Student.class);
				   query.setString(0,student.getPwd());
				   query.setString(1, student.getName());
				   query.executeUpdate();
				   transAction.commit();
				   return 1;
			} catch (HibernateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return 0;
			}
	}

	@Override
	public int del(Student student) {  //登出使用者
		 try {
				Session session=sessionFactory.getCurrentSession();
				Transaction  transAction=session.beginTransaction();
				   Query query=session.createSQLQuery("delete from student where name=?").addEntity(Student.class);
				   query.setString(0,student.getName());
				   query.executeUpdate();
				   transAction.commit();
				   return 1;
			} catch (HibernateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return 0;
			}
	}

}

7 編寫業務層藉口,StudentService:

package com.yc.service;
import com.yc.entity.Student;
public interface StudentService {
	//登入
		public int login(Student student);
		//註冊
		public int add(Student student);		
		//修改
		public int update(Student student);
		//登出
		public int del(Student student);
}

8 實現業務層介面,StudentServiceImpl:

package com.yc.service.Impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.yc.dao.StudentDao;
import com.yc.entity.Student;
import com.yc.service.StudentService;

@Service
public class StudentServiceImpl implements StudentService {
    
	@Resource(name="studentDaoImpl")
	public StudentDao studentDao;
	
	@Override
	public int login(Student student) {
		return studentDao.login(student);
	}

	@Override
	public int add(Student student) {
		return studentDao.add(student);
	}

	@Override
	public int update(Student student) {
		return studentDao.update(student);
	}

	@Override
	public int del(Student student) {
		return studentDao.del(student);
	}

}

9 編寫action類,用於客戶端請求處理:本案例實現對Student物件的增刪改查,所以編寫了四個Action類:LoginAction、AddAction、UpdateAction、DelAction分別實現登入、註冊、修改使用者密碼、登出使用者操作:

LoginAction控制類:

package com.yc.controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.yc.entity.Student;
import com.yc.service.StudentService;

@Controller
public class LoginAction extends ActionSupport{
	
	private static final long serialVersionUID = 3867837111230648465L;
	private String name;
	private String pwd;
	private Student student;

	@Resource(name="studentServiceImpl")
	private StudentService studentService;
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
	public String login(){
		Student student=new Student();
		student.setName(name);
		student.setPwd(pwd);
		int result= studentService.login(student);
		if(result==1){
			ActionContext text=ActionContext.getContext();
			text.getSession().put("user",student.getName());
			return "success";
		}else{
			return "error";
		}
	}

}

AddAction控制類:

package com.yc.controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionSupport;
import com.yc.entity.Student;
import com.yc.service.StudentService;

@Controller
public class AddAction extends ActionSupport {
	private static final long serialVersionUID = 5805525553867263305L;
	private Student student;
	private String name;
	private String pwd;

	@Resource(name="studentServiceImpl")
	private StudentService studentService;
	
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
	public String add(){
		Student student=new Student();
		student.setName(name);
		student.setPwd(pwd);
		int result=studentService.add(student);
		if(result==1){
			return "success";
		}else{
			return "error";
		}
	}
}

UpdateAction控制類:

package com.yc.controller;
import javax.annotation.Resource;
import com.opensymphony.xwork2.ActionSupport;
import com.yc.entity.Student;
import com.yc.service.StudentService;
public class UpdateAction extends ActionSupport {

	private static final long serialVersionUID = 5758012919993220108L;
	private String name;
	private String pwd;
	private Student student;

	@Resource(name="studentServiceImpl")
	private StudentService studentService;
	
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
	public String update(){
		Student student=new Student();
		student.setName(name);
		student.setPwd(pwd);
		int result= studentService.update(student);
		if(result==1){
			return "success";
		}else{
			return "error";
		}
	}
}

DelAction控制類:

package com.yc.controller;
import javax.annotation.Resource;
import com.opensymphony.xwork2.ActionSupport;
import com.yc.entity.Student;
import com.yc.service.StudentService;
public class DelAction extends ActionSupport {
	
	private static final long serialVersionUID = -3188134023173913520L;
	private String name;
	private String pwd;
	private Student student;

	@Resource(name="studentServiceImpl")
	private StudentService studentService;
	
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String del(){
		Student student=new Student();
		student.setName(name);
		student.setPwd(pwd);
		int result= studentService.del(student);
		if(result==1){
			return "success";
		}else{
			return "error";
		}
	}

}

10 接下來就是編寫struts的配置檔案,將請求交個相應的控制類,struts.xml配置檔案如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
  <constant   name="struts.devMode" value="true">
  </constant>
   <package  name="student"  extends="struts-default" namespace="/">
<!--action中的name屬性,就是攔截的請求物件  method是處理請求的方法-->
     <action name="login" class="com.yc.controller.LoginAction"  method="login">
       <result   name="success">/success.jsp</result>
       <result   name="error">/error.jsp</result>
     </action>
     
     <action name="add" class="com.yc.controller.AddAction"  method="add">
             <result   name="success">/index.jsp</result>
             <result   name="error">/register.jsp</result>
      
     </action>
     
     <action name="update" class="com.yc.controller.UpdateAction"  method="update">
            <result   name="success">/index.jsp</result>
     
     </action>
     
     <action name="del" class="com.yc.controller.DelAction"  method="del">
              <result   name="success">/index.jsp</result>
       
     </action>
   </package>
</struts>

11 配置web.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"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
  <display-name>Archetype Created Web Application</display-name>
  
  <welcome-file-list>
    	<welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
	<!-- tomcat開啟時,載入Spring配置檔案 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	
	<!-- 延遲載入的過濾 ,必須設定在前端控制器之前 -->
	<!-- 能保持物件在使用前session為開啟狀態 -->
	<filter>
		<filter-name>OpenSessionView</filter-name>
		<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
		<init-param>
			<param-name>flushMode</param-name>
			<param-value>AUTO</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>OpenSessionView</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	
	<!-- 配置Struts前端控制器 -->
	<filter>
		<filter-name>Struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>Struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

12 配置applicationContext.xml檔案:

<?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:context="http://www.springframework.org/schema/context"
	xmlns:util="http://www.springframework.org/schema/util" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
	default-lazy-init="true">
	
	<!-- 資料來源的配置 -->
	<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="username" value="root"></property>
		<property name="password" value="a"></property>
	</bean>
	
	<!-- sessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="ds">
		</property>
		<!-- hibernate配置資訊 -->
		<property name="hibernateProperties">
			<props>
				<!--   -->
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.formate_sql">false</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>com/yc/entity/Student.hbm.xml</value>
			</list>
		</property>
	</bean>
	     <!--包掃描-->
		<context:component-scan base-package="com"></context:component-scan>
		<mvc:annotation-driven></mvc:annotation-driven>
	
	</beans>

13 前端介面有index.jsp、register.jsp、update.jsp、del.jsp、error.jsp、success.jsp分別是登入介面、註冊介面、修改密碼介面、登出介面、錯誤介面、登入成功介面

index.jsp登入介面:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <title>登入</title>
</head>
<body>
<center>
<form action="login"  method="post">
姓名:<input type="text"  name="name"/></br></br></br>
密碼:<input  type="text" name="pwd"/></br></br></br>
<input type="submit" value="登入" />&nbsp;&nbsp;&nbsp;<a  href="register.jsp" >註冊</a>
</form>
</center>
</body>
</html>

register.jsp註冊介面:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<center>
<form action="add"  method="post">
姓名:<input type="text"  name="name"/></br></br></br>
密碼:<input  type="text" name="pwd"/></br></br></br>
<input type="submit" value="立即註冊" />
</form>
</center>
</body>
</html>

update.jsp修改使用者密碼介面:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>修改密碼</title>
</head>
<body>
   <center>
    <h2>修改密碼!</h2>
		<form action="update" method="post">
				 <input type=hidden name="name" value='<%=request.getSession().getAttribute("user")%>'>
			新密碼:<input type="password" name="pwd">  <br/> <br/>
			<input type="submit" value="確認修改">
		</form>
    </center>
</body>
</html>

del.jsp登出介面:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>登出使用者</title>
</head>
<body>
<center>
<h2>確定要登出嗎?</h2>
    <!-- 登出即刪除使用者所有資料 -->
	<form action="del" method="post">
		<input type="hidden" name="name" value="<%=request.getSession().getAttribute("user")%>">
		<input type="submit" value="確認">
	</form>
	<br/>
</center>
</body>
</html>

error.jsp錯誤介面:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>錯誤頁面</h1>
</body>
</html>

success.jsp登入成功介面:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<center>
<h1>歡迎你,  <%=request.getSession().getAttribute("user")%></h1>
<a  href="update.jsp">修改密碼</a>&nbsp;&nbsp;&nbsp;&nbsp;<a  href="del.jsp">登出</a>
</center>
</body>
</html>

14  效果展示:

15 專案結構圖: