根据上一讲的例子,我们下面就注解的使用进行详细说明。

我们采用sprng MVC开发项目时,通常都会采用注解的方式,这样可以大大提高我们的开发效率。实现零配置。下面我们从零开始重新做一个spring MVC的配置。这个项目完全采用注解的方式开发。同时,我们以后的spring MVC项目也都会采用注解的方式。

修改web.xml,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/hib-config.xml,/WEB-INF/springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
 
</web-app>

springmvc-servlet.xml配置内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      
    <!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
    <context:component-scan base-package="com.sxt"/>
 
    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
 
    <!--对模型视图名称的解析,即在模型视图名称添加前后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:suffix=".jsp"/>
</beans>

hib-config.xml(配置了spring集成hibernate)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="
">
    <context:component-scan  base-package="com.sxt"/>  
    <!-- 支持aop注解 -->
    <aop:aspectj-autoproxy />
     
         
    <bean id="dataSource" 
            class="org.apache.commons.dbcp.BasicDataSource"
            <property name="driverClassName" 
                value="com.mysql.jdbc.Driver"
            </property
            <property name="url" value="jdbc:mysql://localhost:3306/myhib"></property
            <property name="username" value="root"></property
            <property name="password" value="123456"></property>
    </bean
 
   <bean id="sessionFactory" 
       class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
           <property name="dataSource"
               <ref bean="dataSource" /> 
           </property>
           <property name="hibernateProperties"
               <props
                <!-- key的名字前面都要加hibernate. -->
                   <prop key="hibernate.dialect"
                       org.hibernate.dialect.MySQLDialect 
                   </prop
                   <prop key="hibernate.show_sql">true</prop>
                   <prop key="hibernate.hbm2ddl.auto">update</prop>
               </props>
           </property>
        <property name="packagesToScan">
            <value>com.sxt.po</value>
        </property>
   </bean
 
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" >
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
 
<!--配置一个JdbcTemplate实例--> 
<bean id="jdbcTemplate"  class="org.springframework.jdbc.core.JdbcTemplate">  
     <property name="dataSource" ref="dataSource"/>  
</bean
 
 
<!-- 配置事务管理 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager" />
<aop:config>
    <aop:pointcut expression="execution(public * com.sxt.service.impl.*.*(..))" id="businessService"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="businessService" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager" >
    <tx:attributes>
        <tx:method name="find*"  read-only="true" propagation="NOT_SUPPORTED"  />
        <!-- get开头的方法不需要在事务中运行 。
        有些情况是没有必要使用事务的,比如获取数据。开启事务本身对性能是有一定的影响的-->
        <tx:method name="*"/>    <!-- 其他方法在实务中运行 -->
    </tx:attributes>
</tx:advice>
 
</beans>

reg.jsp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
      
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">  
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
    
  <body>
<form action="user.do">
  用户名:<input type=text name=uname /><br/>
<input type=hidden name=method value=reg />
<input type=submit value=注册 />
</form>
  </body>
</html>

index.jsp 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
     
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
   
  <body>
   <h1>**********${params.uname}</h1>
   <h1>**********${requestScope.u}</h1>
   <h1>**********${requestScope.user}</h1>
  </body>
</html>

User.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.sxt.po;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
 
@Entity
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String uname;
    private String pwd;
     
     
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
     
     
}

UserDao.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.sxt.dao;
 
import javax.annotation.Resource;
 
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
 
import com.sxt.po.User;
 
@Repository("userDao")
public class UserDao {
    @Resource
    private HibernateTemplate hibernateTemplate;
     
    public void add(User u){
        System.out.println("UserDao.add()");
        hibernateTemplate.save(u);
    }
 
    public HibernateTemplate getHibernateTemplate() {
        return hibernateTemplate;
    }
 
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;
    }
     
}

UserService.Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.sxt.service;
 
import javax.annotation.Resource;
 
import org.springframework.stereotype.Service;
 
import com.sxt.dao.UserDao;
import com.sxt.po.User;
 
@Service("userService")
public class UserService {
    @Resource
    private UserDao userDao;
     
    public void add(String uname){
        System.out.println("UserService.add()");
        User u = new User();
        u.setUname(uname);
        userDao.add(u);
    }
 
    public UserDao getUserDao() {
        return userDao;
    }
 
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
     
}

UserController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.sxt.web;
 
import javax.annotation.Resource;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
 
import com.sxt.po.User;
import com.sxt.service.UserService;
 
 
@Controller("userController")//这里的
@RequestMapping("/user.do")    
public class UserController  {
 
    @Resource
    private UserService userService;
     
    @RequestMapping(params="method=reg")
    public String reg(String uname) {
        System.out.println("HelloController.handleRequest()");
        userService.add(uname);
        return "index";
    }
     
    public UserService getUserService() {
        return userService;
    }
 
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
 
     
}

说明:

  • @Controller("userController")这里也可以使用component进行注解,这里的controller和component一样,但是一般不用component,而这样的注解还@Repository、@Service、@Controller大家估计都知道怎么使用了,不会的话看我的之前发的blog:http://www.cnblogs.com/wang3680/p/0f4eea023d8eb01b097c732fddba5725.html
  • @RequestMapping("/user.do") 注解说明:这个注解是页面提交到user.dao中进行操作的controller,之前我们的controller还需要进行实现controller接口,而现在不需要实现此接口了,而且controller里面的函数也不需要去复写handleRequest方法了,这里我们就可以自己写自己的方法了,但是我们怎么知道页面提交给那个方法了呢?
  • @RequestMapping(params="method=reg")说明:这个注解就是去解释页面提交的给了那个方法的,就是提交来的带有method=reg的就会调转到此方法中,我们上面的页面中是这样定义传值的<input type=hidden name=method value=reg />
  • 问题又来啦,struts2中我们是根据属性的set和get方法得到我们传递来的值得,这里怎么办呢?我们在controller方法中添加参数将传递的值传递来,public String reg(String uname) 这里的命名必须和页面传来的对应上。

上面的controller中,我们传递的是uname,我们这样呢,将参数改成User user为public String reg(User user)

 

1
2
3
4
5
6
@RequestMapping(params="method=reg2")
   public String reg(User user) {
       System.out.println("HelloController.handleRequest()");
       userService.add(user.getUname());
       return "index";
   }

说明:

这里呢其实是将User模型中的属性拿来用了,我们必须保证页面定义的名称和模型中的一样才行,这一点类此与struts2里面的模型驱动

SpringMVC轻松学习-注解的使用(三)的更多相关文章

  1. SpringMVC轻松学习-SpringMVC介绍(一)

    Spring  MVC 背景介绍 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 ...

  2. SpringMVC轻松学习-其他常用(四)

    Spring MVC 3.0 深入 核心原理 1.      用户发送请求给服务器.url:user.do 2.      服务器收到请求.发现DispatchServlet可以处理.于是调用Disp ...

  3. SpringMVC轻松学习-环境搭建(二)

    基于spring2.5的采用XML配置的spring MVC项目 注:本项目全部基于XML配置.同时,集成了hibernate.采用的是:spring MVC+hibernate+spring的开发架 ...

  4. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  5. Spring+SpringMVC+mybatis整合以及注解的使用(三)

    1.包结构:

  6. (三)SpringMVC之常用注解

    SpringMVC的常用注解 注解 说明 @Controller 用于说明这个类是一个控制器 @RequestMapping 用于注释一个控制器类或者控制器类的方法 @RequestParam 用于将 ...

  7. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

  8. springMVC @ModelAttribute学习

    springMVC @ModelAttribute学习 博客分类: Spring   @ModelAttribute 绑定请求参数到命令对象 @ModelAttribute一个具有如下三个作用: ①绑 ...

  9. 轻松学习RSA加密算法原理 (转)

    轻松学习RSA加密算法原理 (转) http://blog.csdn.net/q376420785/article/details/8557266 http://www.ruanyifeng.com/ ...

随机推荐

  1. 编译 wl18xx驱动源码

    在做beagleboneblack移植的时候,wl18xx的驱动源码是自动编译的.但是移植到其他平台优越平台不一样,所以就不能自动编译 所以用其他方式编译.http://e2e.ti.com/supp ...

  2. swfupload在chrome中点击上传图片按钮无反应的解决办法

    chrome 22.0.XXXXX dev版上传图片按钮点击无反应原因:是GOOGLE的内建Flash PPAPI外挂所导致的. 问题原因: 由于Google浏览器(Chrome),在最新测试版22. ...

  3. 解决oracle数据库连接不上的问题

    今天打开部署好的java开发的网站系统,反应好慢,第一反应就是后台有问题. 查看tomcat一堆的报错信息,重启还是存在. 使用plSql连接数据库看看,登录提示如下:ORA-12514:TNS:监听 ...

  4. CGRect相关工具函数

    NSStringFromCGRect(aCGRect): CGRectFromString(aString):如果把视图的框架以字符串的形式放在NSUserDefaults里面,那么该方法可以将其转回 ...

  5. shell 各种循环判断

    shell支持的循环有 Shell if else Shell case esac Shell for循环 Shell while循环 Shell until循环

  6. Alert()与Redirect()同时使用失效的问题

    例如以下代码: echo "<script>alert('跳转到博客园');</script>"; redirect(“www.cnblogs.com”); ...

  7. 学习笔记——Windows7下Android与Cocos2dx的安装配置

    1.下载eclipse.安卓SDK.配置ADT等,android开发必备,略. 2.下载NDK.Cocos2dx.Cygwin 2.1NDK下载,请下载对应的32位或者64的较大的压缩包(较小的只有t ...

  8. for循环与foreach

    注意点: for循环时,可以对集合进行操作,但foreach循环中,对集合进行操作会报错:                  for 循环可以获取下标 如下代码: package com.tt;imp ...

  9. 转:webdriver驱动未在默认目录安装的firefox

    刚开始用webdriver的朋友一定会苦恼它时常不能启动firefox,很多时候是因为firefox安装在默认路径下.此时,我们有些常用方法,可以解决此问题. [1] System.setProper ...

  10. typedef void far *LPVOID 的具体定义

    首先这里的far,在32位系统已经废除不用了.它是C/C++语言在16位系统中用以标明指针是个远指针的修饰符. 远指针是说指针所指向的地址已经超出了64K(2的十六次方),所以需要使用DS加偏移量的方 ...