您的位置:首页 > 编程语言 > Java开发

Spring3 MVC 注解

2015-06-01 10:51 381 查看
Spring3 MVC 注解(一)

一:配置web.xml

1)问题:spring项目中有多个配置文件mvc.xml dao.xml

2)解决:在web.xml中

[code]    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/xxx/*.xml</param-value>     
              xxx表示xml文件路径    *.xml表示后缀名为xml的任意文件
    </init-param>


3)可以使用 逗号分隔

二:controller

1:spring mvc 中将 controller 认为是 MVC中的C –控制层

2:规范命名 类名 xxxController

3:如果不基于注解: 该类需要继承 CommandController 或者 其他很多 参见 spring帮助

如果基于注解:在类名前 加上 @controller

4:补充:将类名前加上该注解,当spring启动 或者web服务启动 spring会自动扫描所有包(当然,这个可以设置)

作用: 就是告诉服务器 这个类是MVC中的C 这个类可以接收用户请求 处理用户请求

三:问题:如何接收用户请求

1:假设用户请求URL 是: http://localhost:8080/项目名/xxx.do do不do都一样 不管这个do 你用什么都可以

2:这个时候,spring开始在所有的 C 中,找对应的处理请求的方法

3:在任意的可以C的类中,在你想要处理此请求的方法定义的前面

@RequestMapping(“/xxx”) 这个时候的xxx 就是用户请求的xxx 不管do

public String 方法名()

{

return “aaa”;

返回一个字符串,非常有用 要注意 用来决定要显示的MVC的 V 视图层 是哪个

}

四:上面 配置好了 MVC的 C 也就是 控制层 在方法中返回字符串 用来决定MVC的V 视图层

问题:如何让spring 去扫描类 建立关联

1:在配置文件中 (spring)的 假设是 mvc.xml 中

2:加入

五:问题 如何返回到视图层 V

1: 解决:此时,需要在配置文件中,加入视图解析器 有很多种 ,太多了

2:这里用基于jsp/jstl 视图

3:在web.xml 中加入bean 配置

[code]<bean class="org.s...f....web.servlet.view.InternalResourceViewResolver">
       <property  name="prefix" value="/WEB-INF/views"/>                     前缀
      <property  name="suffix"   value=".jsp"/>                                        后缀
</bean>


小结:通过上述5步 ,基本完成 C V 的配置

1:spring 中的C 一般起类名 XXXController 在这个类里面 需要加入@controller 标志这个类可以作为请求处理类 也就是 控制类

2:这个控制类里面可以有很多方法,哪个方法用来处理用户请求,就在那个方法前面 加 @RequestMapping(“/xxxxx请求路径”)

3;当请求处理完毕后 返回值 决定了 该处理完毕后 用户将跳转到那个页面 这个很重要

4:例如

@RequestMapping(“/xxx”) 这个时候的xxx 就是用户请求的xxx 不管do

public String 方法名()

{

return “aaa”;

返回一个字符串,非常有用 要注意 用来决定要显示的MVC的 V 视图层 是哪个

}

返回 aaa 根据配置文件中的 视图处理器配置 加入前缀 后缀

页面将跳转到 /WEB-INF/views/aaa.jsp

Spring3 MVC 注解(二)—@RequestMapping

1 问题:有多个 @RequestMapping

@controller

@RequestMapping(“/aaa”) —————–>类级别 可以不需要 如果要了 下面所有的请求路径前 都需要加入 /aaa

public class ccccontroller{

@RequestMapping(“/bbb”) ———————>方法级别 必须有 决定这个方法处理哪个请求 如果有类级别 /aaa/bbb

public String xxx(){ 如果没有 /bbb

retrun

}

}

2:问题:接收用户请求参数 值

1)请求1: /test/start.do?name=zhangsan

请求2: /test/start/zhangsan.do

在请求2中 将参数作为请求URL 传递 感觉用的不习惯

采用 URL模板

2)@RequestMapping(“/start/{name}”) 这个name 随便 啥都可以

public String start(@PathVariable(“name”) string name){ 反正和上面的对应

return 方法体里面就可以直接获得参数

}

3)包含多个 @RequestMapping (“/start/{name}/{age}”)

3 问题 不同请求方法 用不同处理方法 get post

@RequestMapping (value=”/start” ,method=RequestMethod.GET) 处理post 就换成 POST

Spring3 MVC (三)—请求处理方法 参数及返回值总结

@RequestMapping(“/xxxx”)

public String aaa(){

}

在处理用户请求的方法里 ,

1:参数

a)aaa()无参

b)aaa(@PathVariable(” “) 类型 变量) 用来接收将参数作为URL传递的类型处理

c)aaa(Httpservletrequest 啊 respons啊 session啊 等等) 呵呵 servlet

注意 这里使用session 必须是sessio 已经存在

如何让session存在 request.getSession()

session.setattribute()

进入jsp页面 创建session对象

d)aaa(@RequestParam 类型名 变量名)

就是省略了 request.getParamter 变量名 和 URL里面的参数名相同

e)aaa(@cookValue 类名 变名) (@RequestHeader(“user-Agent”) 类名 变名 )

读 cookie 读HTTP头

f)aaa(PrintWriter out) 代替了 在方法体里面搞一个 PrintWriter out = new PrintWriter();

参数里面 就生产了这个对象 方法体里面可以直接使用 out.println()

g) aaa(Map model)

这个很重要 在方法体中直接可以使用 model 呵呵 看名字就知道是什么了吧 model—-》模型层 装数据啊 实体类啊

在方法里面可以用 model.put(“key” ,value) 就是map 类的对象 键值对

h)aaa(User user) 这个User 是实体类

作用:用户发出带参数请求 xxx .do?name=a&pw=b

在User 这个实体类中 有对应字段 自动将值传入实体类 感觉不实际 不好用 呵呵 感觉而已

2:返回值

a) void

1)一般用在out 直接输出

2)但他还是要返回一个页面的 不然用户看什么

返回规则:生成隐含视图

按照请求路径 appname/test/xxx.do取出test/xxx根据配置文件将前缀后缀加上这个看实际开发情况吧说不清楚了b)String1):最常用简单2)根据返回字符串将配置文件里面的前缀后缀加上c)返回任意类型对象1)模型层自动填充到model中就是Map例如model(“user”,user)2)视图层与void一样d)返回listpublicListqueryUser()1)模型层自动加入model(”userList”,user)页面使用2)页面读取request.getAttribute(“userList”){appname}/test/xxx.do
取出 test/xxx 根据配置文件 将前缀 后缀 加上
这个看实际开发情况吧 说不清楚了
b)String
1):最常用 简单
2)根据返回字符串 将配置文件里面的前缀 后缀 加上
c)返回任意类型对象
1)模型层 自动填充到 model中 就是Map 例如 model(“user”,user)
2) 视图层 与void 一样
d)返回 list
public List queryUser()
{
}
1)模型层 自动加入model(”userList”,user) 页面使用
2)页面读取 request.getAttribute(“userList”)
{userList}

@Resource 注解

被用来激活一个命名资源(named resource)的依赖注入,在JavaEE应用程序中,该注解被典型地转换为绑定于JNDI context中的一个对象。 Spring确实支持使用@Resource通过JNDI lookup来解析对象,默认地,拥有与@Resource注解所提供名字相匹配的“bean name(bean名字)”的Spring管理对象会被注入。 在下面的例子中,Spring会向加了注解的setter方法传递bean名为“dataSource”的Spring管理对象的引用。

[code]@Resource(name="dataSource")
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}


直接使用@Resource注解一个域(field)同样是可能的。通过不暴露setter方法,代码愈发紧凑并且还提供了域不可修改的额外益处。正如下面将要证明的,@Resource注解甚至不需要一个显式的字符串值,在没有提供任何值的情况下,域名将被当作默认值。

[code]@Resource
private DataSource dataSource; // inject the bean named 'dataSource'
该方式被应用到setter方法的时候,默认名是从相应的属性衍生出来,换句话说,命名为'setDataSource'的方法被用来处理名为'dataSource'的属性。
private DataSource dataSource;
@Resource
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}


当@Resource没有显式提供名字的时候,如果根据默认名字找不到对应的Spring管理对象,注入机制会回滚至类型匹配(type-match)。如果刚好只有一个Spring管理对象符合该依赖的类型,那么它会被注入。通过设置CommonAnnotationBeanPostProcessor 的‘fallbackToDefaultTypeMatch’属性为“false”(默认值是“true”)可以禁用这一特性。

[code]<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
<property name="fallbackToDefaultTypeMatch" value="false"/>
</bean>


正如上文所提到的,在解析标有@Resource注解的依赖时,Spring支持JNDI-lookup。如若要强制对所有使用@Resource注解的依赖进行JNDI lookup,那也只要将CommonAnnotationBeanPostProcessor的’alwaysUseJndiLookup’ 标识设置为true就可以了(默认值是false)。

[code]<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
<property name="alwaysUseJndiLookup" value="true"/>
</bean>


另一个选择是,激活指定为‘resource-ref-mappings’的依据全局JNDI名的查找,在@Resource注解内提供‘mappedName’属性。即使目标对象实际上是一个JNDI资源,仍然推荐引入一个Spring管理对象,这样可以提供一个间接层并且因此降低耦合程度。自Spring2.0开始添加命名空间以来,定义一个委托Spring处理JNDI lookup的bean也变得愈发简练:

[code]<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/petclinic"/> 
这个方法的优点在于间接层带来了巨大的部署弹性。比如说,一个单独的系统测试环境应该不再需要JNDI注册。在这种情况下,在系统测试配置中可以提供如下的bean定义:
<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}"/>


顺便提一下,上面的例子中,实际的JDBC连接属性从一个属性文件(properties file)解析而来,在这个属性文件里,关键字与提供的${占位符}互相对应,这需要注册一个名为PropertyPlaceholderConfigurer的BeanFactoryPostProcessor实现来完成。这是具体化那些属性(通常是针对特定环境的属性)常用的技术,这些属性可能比其他配置修改得更为频繁。

[code]<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"/>
</bean>


Srping2.5中新加入了‘context’命名空间,这个命名空间让我们能够得到更为简洁的方式来实现属性占位符(property placeholder)的配置:

[code]<context:property-placeholder location="classpath:jdbc.properties"/>


http://ttaale.iteye.com/blog/761861

http://blog.sina.com.cn/s/blog_a795a96f01016if1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: