1. 程式人生 > >使用Spring的@Autowired 實現DAO, Service, Controller三層的注入

使用Spring的@Autowired 實現DAO, Service, Controller三層的注入

簡述:

結合Spring和Hibernate進行開發

使用@Autowired實現依賴注入, 實現一個學生註冊的功能,做一個技術原型

從DAO(Repository) -> Service -> Controller

目錄結構:


使用Maven做本地包管理,

pom.xml

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>WebProject</groupId>
  <artifactId>StudentManagementWeb</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
   <name>StudentManagementWeb</name>
  <url>http://maven.apache.org</url>

  <properties>
 	  <org.springframework.version>3.0.2.RELEASE</org.springframework.version>
	  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>


  <dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>3.8.1</version>
		<scope>test</scope>
	</dependency>
    <!-- Project Requirements -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>servlet-api</artifactId>
	    <version>2.5</version>
	</dependency>
	<dependency>
	    <groupId>org.slf4j</groupId>
	    <artifactId>slf4j-log4j12</artifactId>
	    <version>1.4.2</version>
	    </dependency>
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-beans</artifactId>
	    <version>${org.springframework.version}</version>
	</dependency>
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-jdbc</artifactId>
	    <version>${org.springframework.version}</version>
	    </dependency>
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-web</artifactId>
	    <version>${org.springframework.version}</version>
	</dependency>
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-webmvc</artifactId>
	    <version>${org.springframework.version}</version>
    </dependency>
	<dependency>
	    <groupId>org.springframework</groupId>
		<artifactId>spring-orm</artifactId>
		<version>${org.springframework.version}</version>
	</dependency>
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-entitymanager</artifactId>
		<version>3.4.0.GA</version>
	</dependency>
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-envers</artifactId>
		<version>3.5.6-Final</version>
	</dependency>
	<dependency>
		<groupId>taglibs</groupId>
		<artifactId>standard</artifactId>
		<version>1.1.2</version>
	</dependency>
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>jstl</artifactId>
		<version>1.1.2</version>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.10</version>
	</dependency>
	<dependency>
		<groupId>commons-dbcp</groupId>
		<artifactId>commons-dbcp</artifactId>
		<version>20030825.184428</version>
	</dependency>
	<dependency>
		<groupId>commons-pool</groupId>
		<artifactId>commons-pool</artifactId>
		<version>20030825.183949</version>
	</dependency>
	<dependency>
		<groupId>cglib</groupId>
		<artifactId>cglib</artifactId>
		<version>2.2.2</version>
	</dependency>
	<dependency>
   		<groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.12</version>
	</dependency>
  </dependencies>  
</project>


各檔案如下:

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" 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>StudentManagementWeb</display-name>
  <welcome-file-list>
    <welcome-file>StudentRegistration.jsp</welcome-file>
  </welcome-file-list>
  
  <resource-ref>
	<description>DB Connection</description>
	<res-ref-name>jdbc/smw</res-ref-name>
	<res-type>javax.sql.DataSource</res-type>
	<res-auth>Container</res-auth>
  </resource-ref>
  
  <context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>/WEB-INF/log4j.properties</param-value> 
  </context-param> 
  
  <!-- Define LOG4J Listener --> 
  <listener> 
   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
  </listener> 
  
  <servlet>
  <!-- define the name of Servlet -->
  <servlet-name>dispatcherServlet</servlet-name>
  <!-- Servlet implementation class -->
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- initialize the context -->
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <!-- load configuration -->
  <param-value>/WEB-INF/applicationContext.xml</param-value>
  </init-param>
  <!-- set loading priority -->
  <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
</web-app>

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: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-2.5.xsd             
	   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd             
	   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

	
	 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
	
	 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
	 	<property name="configLocation">
			<value>classpath:hibernate.cfg.xml</value>
		</property>
	</bean>
	 
	 <!-- make spring look up annotation -->
	 <context:annotation-config/>
	
	 <context:component-scan base-package="smw.*"/>
	 
	 <!-- configure the transaction management -->
	 <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">         
	 	<property name="sessionFactory">             
	 		<ref bean="sessionFactory" />         
	 	</property>     
	 </bean>
	 
	 <tx:annotation-driven transaction-manager="txManager" />

</beans>

hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

	<session-factory>
		<property name="connection.datasource">java:comp/env/jdbc/smw</property>
 		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="show_sql">true</property><!-- show sql statement -->
		<!-- mapping files -->
		<mapping resource="smw/model/Student.hbm.xml"/>
	</session-factory>

</hibernate-configuration>
由於使用了Tomcat的資料來源,所以還需要在Tomcat的Context.xml中新增資料庫連線配置

context.xml(Tomcat server中檔案,eclispe中在workspace中的server project中)

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
--><!-- The contents of this file will be loaded for each web application --><Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
	
    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->
    <Resource name="jdbc/smw" auth="Container" type="javax.sql.DataSource"
		maxActive="100" maxIdle="30" maxWait="10000"
		username="root" password="sql" driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://localhost:3306/smw"/>

</Context>

Student.java

package smw.model;


public class Student {
	private int sid;
	private String name;
	private String password;
	private String college;
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getCollege() {
		return college;
	}
	public void setCollege(String college) {
		this.college = college;
	}
}

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="smw.model.Student" table="tb_student" catalog="smw">
		<id name="sid" column="sid" type="int">
			<generator class="increment"/>
		</id>
		<property name="name" type="java.lang.String">
		    <column name="name"  not-null="true" length="20">
		        <comment>student's name</comment>
		    </column>
		</property>
		<property name="password" type="java.lang.String">
		    <column name="password"  not-null="false" length="10">
		        <comment>student's password</comment>
		    </column>
		</property>
		<property name="college" type="java.lang.String">
		    <column name="college"  not-null="false" length="20">
		        <comment>student's college</comment>
		    </column>
		</property>
	</class>
</hibernate-mapping>

IStudentDAO.java

package smw.dao;

import smw.model.Student;

public interface IStudentDAO {
	/**
	 * Save Student into database
	 * @param student
	 */
	public void saveStudent(Student student);
	
}


StudentDAOImpl.java

package smw.dao.impl;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import smw.dao.IStudentDAO;
import smw.model.Student;

@SuppressWarnings("restriction")
@Repository("studentDAO")
@Transactional
public class StudentDAOImpl extends HibernateDaoSupport implements IStudentDAO{
	
	@Resource(name="sessionFactory")
	 public void setSuperSessionFactory(SessionFactory sessionFactory){     
		super.setSessionFactory(sessionFactory);
	}

	public void saveStudent(Student student){
		getHibernateTemplate().save(student);
	}

}

IStudentManagementService.java
package smw.service;

import smw.model.Student;

public interface IStudentManagementService {
	public void addStudent(Student student);
}

StudentManagementServiceImpl.java

package smw.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import smw.dao.IStudentDAO;
import smw.model.Student;
import smw.service.IStudentManagementService;

@Service
public class StudentManagementServiceImpl implements IStudentManagementService {
	@Autowired
	private IStudentDAO studentDAO;
	
	@Transactional(propagation=Propagation.REQUIRED)
	public void addStudent(Student student) {
		studentDAO.saveStudent(student);
	}
}

StudentAction.java

package smw.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import smw.model.Student;
import smw.service.IStudentManagementService;

@Controller
@RequestMapping("StudentAction.do")
public class StudentAction extends MultiActionController{
	@Autowired
	private IStudentManagementService studentManagementService;
	
	@RequestMapping(params = "method=HandleStudentRegistrationFormSubmit")
	protected ModelAndView HandleStudentRegistrationFormSubmit(HttpServletRequest request
			, HttpServletResponse response) {	
		Student student = new Student();
		String name = request.getParameter("name");
		String password = request.getParameter("password");
		String college = request.getParameter("college");
		
		student.setName(name);
		student.setPassword(password);
		student.setCollege(college);

		studentManagementService.addStudent(student);
		return new ModelAndView("StudentRegistered.jsp");
	}
}

StudentRegistration.jsp
<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="ISO-8859-1"%>
<!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>User Registration</title>
</head>
<body>
    <h1 align="center">Student Registration Page</h1>
	<form method="post" action="StudentAction.do?method=HandleStudentRegistrationFormSubmit" class="form">
		<table width="280" border="0" align="center">
			<tr>
				<td width="87" align="center" valign="middle" >
						<div align="right">name:</div>
				</td>
				<td width="183">
				  <label>
					<input name="name" type="text" id="name" maxlength="10" />
				  </label>
				<td>
			</tr>
			<tr>
				<td height="37" align="center" valign="middle">
				  <div align="right">password: </div>
				</td>
				<td>
					<label> 
						<input name="password" type="password" id="password" maxlength="20" /> 
					</label>
				</td>
			</tr>
			<tr>
				<td height="37" align="center" valign="middle">
				  <div align="right">college: </div>
				</td>
				<td>
					<label> 
						<input name="college" type="text" id="college" maxlength="20" /> 
					</label>
				</td>
			</tr>
			<tr>
				<td align="center" valign="middle">
				    <input type="submit" name="Submit" value="submit" />
				</td>
				<td> 
				    <input name="reset" type="reset" id="reset" value="reset" />
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

StudentRegistered.jsp
<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="ISO-8859-1"%>
<!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=GBK">
<title>User Registered</title>
</head>
  <body>
  	<center>
  	  <span class="STYLE2">Student Registered</span>
  	</center>
  	<br>
  	<table align="center" border="1">
  		<tr>
  			<td height="100"><span class="STYLE2">user name:</span></td>
  			<td height="100"><span class="STYLE2">${param.name }</span></td>
  		</tr>
  		<tr>
  			<td height="100"><span class="STYLE2">password:</span></td>
  			<td height="100"><span class="STYLE2">${param.password }</span></td>
  		</tr>
  		  		<tr>
  			<td height="100"><span class="STYLE2">college:</span></td>
  			<td height="100"><span class="STYLE2">${param.college }</span></td>
  		</tr>
  		<tr>
  			<td height="100" colspan="2" align="center"><a href="StudentRegistration.jsp" class="STYLE2">return to registration</a></td>
  		</tr>
  </table>
  </body>
</html>

結果:


跳轉後,


資料庫中新增記錄,