spring mvc注解实现

来源:互联网 发布:推荐算法 数据集 编辑:程序博客网 时间:2024/05/17 03:55

  弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,现在这一篇补上。下面开始贴代码。

文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下。

先说web.xml配置:

[java] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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">  
  3.   <display-name>s3h3</display-name>  
  4.    <context-param>    
  5.      <param-name>contextConfigLocation</param-name>    
  6.      <param-value>classpath:applicationContext*.xml</param-value>    
  7.  </context-param>    
  8.   <listener>    
  9.      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
  10.  </listener>    
  11.   
  12.  <servlet>    
  13.      <servlet-name>spring</servlet-name>    
  14.      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
  15.      <load-on-startup>1</load-on-startup>    
  16.  </servlet>    
  17.  <servlet-mapping>    
  18.      <servlet-name>spring</servlet-name>  <!-- 这里在配成spring,下边也要写一个名为spring-servlet.xml的文件,主要用来配置它的controller -->  
  19.      <url-pattern>*.do</url-pattern>    
  20.  </servlet-mapping>    
  21.   <welcome-file-list>  
  22.     <welcome-file>index.jsp</welcome-file>  
  23.   </welcome-file-list>  
  24. </web-app>  

 

spring-servlet,主要配置controller的信息

[java] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   <beans xmlns="http://www.springframework.org/schema/beans"    
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"    
  4.         xmlns:context="http://www.springframework.org/schema/context"    
  5.    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  6.        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  7.        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  8.        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  9.     
  10.   <context:annotation-config />  
  11.        <!-- 把标记了@Controller注解的类转换为bean -->    
  12.       <context:component-scan base-package="com.mvc.controller" />    
  13.   <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->    
  14.       <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />    
  15.        
  16.        <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->    
  17.        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"    
  18.           p:prefix="/WEB-INF/view/" p:suffix=".jsp" />    
  19.           
  20.        <bean id="multipartResolver"    
  21.           class="org.springframework.web.multipart.commons.CommonsMultipartResolver"    
  22.           p:defaultEncoding="utf-8" />    
  23.  </beans>  

 

applicationContext.xml代码

[java] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.  xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"  
  4.  xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.  xsi:schemaLocation="  
  7.          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  9.    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  10.    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  11.   
  12.  <context:annotation-config />  
  13.  <context:component-scan base-package="com.mvc" />  <!-- 自动扫描所有注解该路径 -->  
  14.   
  15.  <context:property-placeholder location="classpath:/hibernate.properties" />  
  16.   
  17.  <bean id="sessionFactory"  
  18.   class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  19.   <property name="dataSource" ref="dataSource" />  
  20.   <property name="hibernateProperties">  
  21.    <props>  
  22.     <prop key="hibernate.dialect">${dataSource.dialect}</prop>  
  23.     <prop key="hibernate.hbm2ddl.auto">${dataSource.hbm2ddl.auto}</prop>  
  24.     <prop key="hibernate.hbm2ddl.auto">update</prop>  
  25.    </props>  
  26.   </property>  
  27.   <property name="packagesToScan">  
  28.    <list>  
  29.     <value>com.mvc.entity</value><!-- 扫描实体类,也就是平时所说的model -->  
  30.    </list>  
  31.     </property>  
  32.  </bean>  
  33.   
  34.  <bean id="transactionManager"  
  35.   class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  36.   <property name="sessionFactory" ref="sessionFactory" />  
  37.   <property name="dataSource" ref="dataSource" />  
  38.  </bean>  
  39.   
  40.  <bean id="dataSource"  
  41.   class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  42.   <property name="driverClassName" value="${dataSource.driverClassName}" />  
  43.   <property name="url" value="${dataSource.url}" />  
  44.   <property name="username" value="${dataSource.username}" />  
  45.   <property name="password" value="${dataSource.password}" />  
  46.  </bean>  
  47.  <!-- Dao的实现 -->  
  48.  <bean id="entityDao" class="com.mvc.dao.EntityDaoImpl">    
  49.   <property name="sessionFactory" ref="sessionFactory" />  
  50.  </bean>  
  51.  <tx:annotation-driven transaction-manager="transactionManager" />  
  52.  <tx:annotation-driven mode="aspectj"/>  
  53.     
  54.     <aop:aspectj-autoproxy/>    
  55. </beans>  

 

hibernate.properties数据库连接配置

[java] view plaincopy
  1. dataSource.password=123  
  2. dataSource.username=root  
  3. dataSource.databaseName=test  
  4. dataSource.driverClassName=com.mysql.jdbc.Driver  
  5. dataSource.dialect=org.hibernate.dialect.MySQL5Dialect  
  6. dataSource.serverName=localhost:3306  
  7. dataSource.url=jdbc:mysql://localhost:3306/test  
  8. dataSource.properties=user=${dataSource.username};databaseName=${dataSource.databaseName};serverName=${dataSource.serverName};password=${dataSource.password}  
  9. dataSource.hbm2ddl.auto=update  

 

配置已经完成,下面开始例子

先在数据库建表,例子用的是mysql数据库

[java] view plaincopy
  1. CREATE TABLE  `test`.`student` (  
  2.   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  3.   `name` varchar(45) NOT NULL,  
  4.   `psw` varchar(45) NOT NULL,  
  5.   PRIMARY KEY (`id`)  
  6. )  

 

建好表后,生成实体类

[java] view plaincopy
  1. package com.mvc.entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.persistence.Basic;  
  6. import javax.persistence.Column;  
  7. import javax.persistence.Entity;  
  8. import javax.persistence.GeneratedValue;  
  9. import javax.persistence.GenerationType;  
  10. import javax.persistence.Id;  
  11. import javax.persistence.Table;  
  12.   
  13. @Entity  
  14. @Table(name = "student")  
  15. public class Student implements Serializable {  
  16.     private static final long serialVersionUID = 1L;  
  17.     @Id  
  18.     @Basic(optional = false)  
  19.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
  20.     @Column(name = "id", nullable = false)  
  21.     private Integer id;  
  22.     @Column(name = "name")  
  23.     private String user;  
  24.     @Column(name = "psw")  
  25.     private String psw;  
  26.     public Integer getId() {  
  27.         return id;  
  28.     }  
  29.     public void setId(Integer id) {  
  30.         this.id = id;  
  31.     }  
  32.       
  33.     public String getUser() {  
  34.         return user;  
  35.     }  
  36.     public void setUser(String user) {  
  37.         this.user = user;  
  38.     }  
  39.     public String getPsw() {  
  40.         return psw;  
  41.     }  
  42.     public void setPsw(String psw) {  
  43.         this.psw = psw;  
  44.     }  
  45. }  

 

 Dao层实现

[java] view plaincopy
  1. package com.mvc.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. public interface EntityDao {  
  6.     public List<Object> createQuery(final String queryString);  
  7.     public Object save(final Object model);  
  8.     public void update(final Object model);  
  9.     public void delete(final Object model);  
  10. }  

 

[java] view plaincopy
  1. package com.mvc.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.hibernate.Query;  
  6. import org.springframework.orm.hibernate3.HibernateCallback;  
  7. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  8.   
  9. public class EntityDaoImpl extends HibernateDaoSupport implements EntityDao{  
  10.     public List<Object> createQuery(final String queryString) {  
  11.         return (List<Object>) getHibernateTemplate().execute(  
  12.                 new HibernateCallback<Object>() {  
  13.                     public Object doInHibernate(org.hibernate.Session session)  
  14.                             throws org.hibernate.HibernateException {  
  15.                         Query query = session.createQuery(queryString);  
  16.                         List<Object> rows = query.list();  
  17.                         return rows;  
  18.                     }  
  19.                 });  
  20.     }  
  21.     public Object save(final Object model) {  
  22.         return  getHibernateTemplate().execute(  
  23.                 new HibernateCallback<Object>() {  
  24.                     public Object doInHibernate(org.hibernate.Session session)  
  25.                             throws org.hibernate.HibernateException {  
  26.                         session.save(model);  
  27.                         return null;  
  28.                     }  
  29.                 });  
  30.     }  
  31.     public void update(final Object model) {  
  32.         getHibernateTemplate().execute(new HibernateCallback<Object>() {  
  33.             public Object doInHibernate(org.hibernate.Session session)  
  34.                     throws org.hibernate.HibernateException {  
  35.                 session.update(model);  
  36.                 return null;  
  37.             }  
  38.         });  
  39.     }  
  40.     public void delete(final Object model) {  
  41.         getHibernateTemplate().execute(new HibernateCallback<Object>() {  
  42.             public Object doInHibernate(org.hibernate.Session session)  
  43.                     throws org.hibernate.HibernateException {  
  44.                 session.delete(model);  
  45.                 return null;  
  46.             }  
  47.         });  
  48.     }  
  49. }  
  

 Dao在applicationContext.xml注入

<bean id="entityDao" class="com.mvc.dao.EntityDaoImpl">  
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>

Dao只有一个类的实现,直接供其它service层调用,如果你想更换为其它的Dao实现,也只需修改这里的配置就行了。

 

开始写view页面,WEB-INF/view下新建页面student.jsp,WEB-INF/view这路径是在spring-servlet.xml文件配置的,你可以配置成其它,也可以多个路径。student.jsp代码

[xhtml] view plaincopy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@ include file="/include/head.jsp"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8. <title>添加</title>  
  9. <mce:script language="javascript" src="<%=request.getContextPath()%><!--  
  10. /script/jquery.min.js">  
  11. // --></mce:script>  
  12. <mce:style><!--  
  13. table{  border-collapse:collapse;  }  
  14. td{  border:1px solid #f00;  }  
  15. --></mce:style><style mce_bogus="1">table{  border-collapse:collapse;  }  
  16. td{  border:1px solid #f00;  }</style>  
  17. <mce:script type="text/javascript"><!--  
  18. function add(){  
  19.     window.location.href="<%=request.getContextPath() %>/student.do?method=add";  
  20. }  
  21.   
  22. function del(id){  
  23. $.ajax( {  
  24.     type : "POST",  
  25.     url : "<%=request.getContextPath()%>/student.do?method=del&id=" + id,  
  26.     dataType: "json",  
  27.     success : function(data) {  
  28.         if(data.del == "true"){  
  29.             alert("删除成功!");  
  30.             $("#" + id).remove();  
  31.         }  
  32.         else{  
  33.             alert("删除失败!");  
  34.         }  
  35.     },  
  36.     error :function(){  
  37.         alert("网络连接出错!");  
  38.     }  
  39. });  
  40. }  
  41. // --></mce:script>  
  42. </head>  
  43. <body>  
  44.   
  45. <input id="add" type="button" onclick="add()" value="添加"/>  
  46. <table >  
  47.     <tr>  
  48.         <td>序号</td>  
  49.         <td>姓名</td>  
  50.         <td>密码</td>  
  51.         <td>操作</td>  
  52.     </tr>  
  53.     <c:forEach items="${list}" var="student">  
  54.     <tr id="<c:out value="${student.id}"/>">  
  55.         <td><c:out value="${student.id}"/></td>  
  56.         <td><c:out value="${student.user}"/></td>  
  57.         <td><c:out value="${student.psw}"/></td>  
  58.         <td>  
  59.             <input type="button" value="编辑"/>       
  60.             <input type="button" onclick="del('<c:out value="${student.id}"/>')" value="删除"/>  
  61.         </td>  
  62.     </tr>  
  63.     </c:forEach>  
  64.       
  65. </table>  
  66. </body>  
  67. </html>  
  

 

student_add.jsp

[xhtml] view plaincopy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@ include file="/include/head.jsp"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8. <title>学生添加</title>  
  9. <mce:script type="text/javascript"><!--  
  10. function turnback(){  
  11.     window.location.href="<%=request.getContextPath() %>/student.do";  
  12. }  
  13. // --></mce:script>  
  14. </head>  
  15. <body>  
  16. <form method="post" action="<%=request.getContextPath() %>/student.do?method=save">  
  17. <div><c:out value="${addstate}"></c:out></div>  
  18. <table>  
  19.     <tr><td>姓名</td><td><input id="user" name="user" type="text" /></td></tr>  
  20.     <tr><td>密码</td><td><input id="psw" name="psw"  type="text" /></td></tr>  
  21.     <tr><td colSpan="2" align="center"><input type="submit" value="提交"/><input type="button" onclick="turnback()" value="返回" /> </td></tr>  
  22. </table>  
  23.   
  24. </form>  
  25. </body>  
  26. </html>  

 

controller类实现,只需把注解写上,spring就会自动帮你找到相应的bean,相应的注解标记意义,不明白的,可以自己查下@Service,@Controller,@Entity等等的内容。

 

[java] view plaincopy
  1. package com.mvc.controller;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7.   
  8. import org.apache.commons.logging.Log;  
  9. import org.apache.commons.logging.LogFactory;  
  10. import org.springframework.beans.factory.annotation.Autowired;  
  11. import org.springframework.stereotype.Controller;  
  12. import org.springframework.ui.ModelMap;  
  13. import org.springframework.web.bind.annotation.RequestMapping;  
  14. import org.springframework.web.bind.annotation.RequestMethod;  
  15. import org.springframework.web.bind.annotation.RequestParam;  
  16. import org.springframework.web.servlet.ModelAndView;  
  17.   
  18. import com.mvc.entity.Student;  
  19. import com.mvc.service.StudentService;  
  20.   
  21. @Controller  
  22. @RequestMapping("/student.do")  
  23. public class StudentController {  
  24.     protected final transient Log log = LogFactory  
  25.     .getLog(StudentController.class);  
  26.     @Autowired  
  27.     private StudentService studentService;  
  28.     public StudentController(){  
  29.           
  30.     }  
  31.       
  32.     @RequestMapping  
  33.     public String load(ModelMap modelMap){  
  34.         List<Object> list = studentService.getStudentList();  
  35.         modelMap.put("list", list);  
  36.         return "student";  
  37.     }  
  38.       
  39.     @RequestMapping(params = "method=add")  
  40.     public String add(HttpServletRequest request, ModelMap modelMap) throws Exception{  
  41.         return "student_add";  
  42.     }  
  43.       
  44.     @RequestMapping(params = "method=save")  
  45.     public String save(HttpServletRequest request, ModelMap modelMap){  
  46.         String user = request.getParameter("user");  
  47.         String psw = request.getParameter("psw");  
  48.         Student st = new Student();  
  49.         st.setUser(user);  
  50.         st.setPsw(psw);  
  51.         try{  
  52.             studentService.save(st);  
  53.             modelMap.put("addstate""添加成功");  
  54.         }  
  55.         catch(Exception e){  
  56.             log.error(e.getMessage());  
  57.             modelMap.put("addstate""添加失败");  
  58.         }  
  59.           
  60.         return "student_add";  
  61.     }  
  62.       
  63.     @RequestMapping(params = "method=del")  
  64.     public void del(@RequestParam("id") String id, HttpServletResponse response){  
  65.         try{  
  66.             Student st = new Student();  
  67.             st.setId(Integer.valueOf(id));  
  68.             studentService.delete(st);  
  69.             response.getWriter().print("{/"del/":/"true/"}");  
  70.         }  
  71.         catch(Exception e){  
  72.             log.error(e.getMessage());  
  73.             e.printStackTrace();  
  74.         }  
  75.     }  
  76. }  

 

service类实现

[java] view plaincopy
  1. package com.mvc.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.stereotype.Service;  
  7. import org.springframework.transaction.annotation.Transactional;  
  8.   
  9. import com.mvc.dao.EntityDao;  
  10. import com.mvc.entity.Student;  
  11.   
  12. @Service  
  13. public class StudentService {  
  14.  @Autowired  
  15.  private EntityDao entityDao;  
  16.    
  17.  @Transactional  
  18.  public List<Object> getStudentList(){  
  19.   StringBuffer sff = new StringBuffer();  
  20.   sff.append("select a from ").append(Student.class.getSimpleName()).append(" a ");  
  21.   List<Object> list = entityDao.createQuery(sff.toString());  
  22.   return list;  
  23.  }  
  24.    
  25.  public void save(Student st){  
  26.   entityDao.save(st);  
  27.  }  
  28.  public void delete(Object obj){  
  29.   entityDao.delete(obj);  
  30.  }  
  31. }  
  

 

OK,例子写完。有其它业务内容,只需直接新建view,并实现相应comtroller和service就行了,配置和dao层的内容基本不变,也就是每次只需写jsp(view),controller和service调用dao就行了。

怎样,看了这个,spring mvc是不是比ssh实现更方便灵活。

 

 

附件源码:s3h 

原创粉丝点击