Spring学习(六)—— Spring注解(二)
核心原理
1. 用户发送请求给服务器。url:user.do
2. 服务器收到请求。发现Dispatchservlet可以处理。于是调用DispatchServlet。
3. DispatchServlet内部,通过HandleMapping检查这个url有没有对应的Controller。如果有,则调用Controller。
4、 Control开始执行
5. Controller执行完毕后,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对象本身就包含了视图对象信息。
6. DispatchServlet将执视图对象中的数据,输出给服务器。
7. 服务器将数据输出给客户端。
spring3.0中相关jar包的含义
org.springframework.aop-3.0.3.RELEASE.jar |
spring的aop面向切面编程 |
org.springframework.asm-3.0.3.RELEASE.jar |
spring独立的asm字节码生成程序 |
org.springframework.beans-3.0.3.RELEASE.jar |
IOC的基础实现 |
org.springframework.context-3.0.3.RELEASE.jar |
IOC基础上的扩展服务 |
org.springframework.core-3.0.3.RELEASE.jar |
spring的核心包 |
org.springframework.expression-3.0.3.RELEASE.jar |
spring的表达式语言 |
org.springframework.web-3.0.3.RELEASE.jar |
web工具包 |
org.springframework.web.servlet-3.0.3.RELEASE.jar |
mvc工具包 |
@Controller控制器定义
和Struts1一样,Spring的Controller是Singleton的。这就意味着会被多个请求线程共享。因此,我们将控制器设计成无状态类。
在spring 3.0中,通过@controller标注即可将class定义为一个controller类。为使spring能找到定义为controller的bean,需要在spring-context配置文件中增加如下定义:
<context:component-scan base-package="com.sxt.web"/> |
注:实际上,使用@component,也可以起到@Controller同样的作用。
@RequestMapping
在类前面定义,则将url和类绑定。
在方法前面定义,则将url和类的方法绑定
@RequestParam
一般用于将指定的请求参数付给方法中形参。示例代码如下:
@RequestMapping(params="method=reg5") public String reg5(@RequestParam("name")String uname,ModelMap map) { System.out.println("HelloController.handleRequest()"); System.out.println(uname); return"index"; }
这样,就会将name参数的值付给uname。当然,如果请求参数名称和形参名称保持一致,则不需要这种写法。
@SessionAttributes
将ModelMap中指定的属性放到session中。示例代码如下:
@Controller @RequestMapping("/user.do") @SessionAttributes({"u","a"}) //将ModelMap中属性名字为u、a的再放入session中。这样,request和session中都有了。 publicclass UserController { @RequestMapping(params="method=reg4") public String reg4(ModelMap map) { System.out.println("HelloController.handleRequest()"); map.addAttribute("u","uuuu"); //将u放入request作用域中,这样转发页面也可以取到这个数据。 return"index"; } }
<body> <h1>**********${requestScope.u.uname}</h1> <h1>**********${sessionScope.u.uname}</h1> </body>
注:名字为”user”的属性再结合使用注解@SessionAttributes可能会报错。
@ModelAttribute
这个注解可以跟@SessionAttributes配合在一起用。可以将ModelMap中属性的值通过该注解自动赋给指定变量。
示例代码如下:
package com.sxt.web; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.SessionAttributes; @Controller @RequestMapping("/user.do") @SessionAttributes({"u","a"}) publicclass UserController { @RequestMapping(params="method=reg4") public String reg4(ModelMap map) { System.out.println("HelloController.handleRequest()"); map.addAttribute("u","尚学堂高淇"); return"index"; } @RequestMapping(params="method=reg5") public String reg5(@ModelAttribute("u")String uname ,ModelMap map) { System.out.println("HelloController.handleRequest()"); System.out.println(uname); return"index"; } }
先调用reg4方法,再调用reg5方法。
Controller类中方法参数的处理
Controller类中方法返回值的处理
1. 返回string(建议)
a) 根据返回值找对应的显示页面。路径规则为:prefix前缀+返回值+suffix后缀组成
b) 代码如下:
@RequestMapping(params="method=reg4") public String reg4(ModelMap map) { System.out.println("HelloController.handleRequest()"); return"index"; }
前缀为:/WEB-INF/jsp/ 后缀是:.jsp
在转发到:/WEB-INF/jsp/index.jsp
2. 也可以返回ModelMap、ModelAndView、map、List、Set、Object、无返回值。一般建议返回字符串!
请求转发和重定向
代码示例:
package com.sxt.web; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.SessionAttributes; @Controller @RequestMapping("/user.do") publicclass UserController { @RequestMapping(params="method=reg4") public String reg4(ModelMap map) { System.out.println("HelloController.handleRequest()"); // return "forward:index.jsp"; // return "forward:user.do?method=reg5"; //转发 // return "redirect:user.do?method=reg5"; //重定向 return"redirect:http://www.baidu.com"; //重定向 } @RequestMapping(params="method=reg5") public String reg5(String uname,ModelMap map) { System.out.println("HelloController.handleRequest()"); System.out.println(uname); return"index"; } }
访问reg4方法,既可以看到效果。
获得request对象、session对象
普通的Controller类,示例代码如下:
@Controller @RequestMapping("/user.do") publicclass UserController { @RequestMapping(params="method=reg2") public String reg2(String uname,HttpServletRequest req,ModelMap map){ req.setAttribute("a", "aa"); req.getSession().setAttribute("b", "bb"); return"index"; } }
ModelMap
是map的实现,可以在其中存放属性,作用域同request。下面这个示例,我们可以在modelMap中放入数据,然后在forward的页面上显示这些数据。通过el表达式、JSTL、java代码均可。代码如下:
package com.sxt.web; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; @Controller @RequestMapping("/user.do") publicclass UserController extends MultiActionController { @RequestMapping(params="method=reg") public String reg(String uname,ModelMap map){ map.put("a", "aaa"); return"index"; } }
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head></head> <body> <h1>${requestScope.a}</h1> <c:out value="${requestScope.a}"></c:out> </body> </html>
将属性u的值赋给形参uname
ModelAndView模型视图类
见名知意,从名字上我们可以知道ModelAndView中的Model代表模型,View代表视图。即,这个类把要显示的数据存储到了Model属性中,要跳转的视图信息存储到了view属性。我们看一下ModelAndView的部分源码,即可知其中关系:
Spring学习(六)—— Spring注解(二)的更多相关文章
- Spring学习(六)-----Spring使用@Autowired注解自动装配
Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...
- spring学习 六 spring与mybatis整合
在mybatis学习中有两种配置文件 :全局配置文件,映射配置文件.mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让sp ...
- Spring学习(十一)-----Spring使用@Required注解依赖检查
Spring学习(九)-----Spring依赖检查 bean 配置文件用于确定的特定类型(基本,集合或对象)的所有属性被设置.在大多数情况下,你只需要确保特定属性已经设置但不是所有属性.. 对于这种 ...
- Spring学习六(事物管理)
参考链接 http://www.mamicode.com/info-detail-1248286.html http://www.cnblogs.com/wangdaqian/archive/2017 ...
- spring学习12 -Spring 框架模块以及面试常见问题注解等
以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较 ...
- Spring学习之事务注解@Transactional
今天学习spring中的事务注解,在学习Spring注解事务之前需要明白一些事务的基本概念: 事务:并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通 ...
- Spring学习之常用注解(转)
使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...
- spring学习六----------Bean的配置之Aware接口
© 版权声明:本文为博主原创文章,转载请注明出处 Aware Spring提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化后,可以获取相应的资源 通过Aware接口,可以对S ...
- Spring Cloud 学习 (六) Spring Cloud Config
在实际开发过程中,每个服务都有大量的配置文件,例如数据库的配置.日志输出级别的配置等,而往往这些配置在不同的环境中也是不一样的.随着服务数量的增加,配置文件的管理也是一件非常复杂的事 在微服务架构中, ...
- spring学习(三) ———— spring事务操作
前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...
随机推荐
- Bootstrap源码解读之栅格化篇
本文纯属自己研究所写笔记,如果有错误还请多多指教提出 版心(container) 版心:class名为.container的容器,其版心的宽度在各个屏幕设备下是不一样的值,版心两边就是留白. 各尺寸下 ...
- 单片机中不带字库LCD液晶屏显示少量汉字
单片机中不带字库LCD液晶屏如何显示少量汉字,一般显示汉字的方法有1.使用带字库的LCD屏,2.通过SD 卡或者外挂spi flash存中文字库,3.直接将需要的汉字取模存入mcu的flash中. 第 ...
- ruby on rails 环境搭建(mac or ubuntu)
环境配置前操作 mac: app_store安装x-code ubuntu: 终端->配置文件->首选项->命令->以shell方式登录 安装RVM mac: $ ruby - ...
- spark执行命令 监控执行命令
#!/bin/bash #/usr/hdp/current/flume-server/bin/flume-ng agent -c conf/ -f /usr/hdp/current/flume-ser ...
- php安装redis拓展
1. 查看是否安装redis库 查看是否安装redis库了.可以通过下面2种方式查看. phpinfo()是否能输出redis的加载信息 在命令行执行`php -m` 输出gd 2. 安装redis库 ...
- 20155226 2016-2017-2 《Java程序设计》第一周学习总结
20155226 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 第一周主要学习了一二章的内容,也浏览了剩余章节,以下是本周主要学习内容总结 1.首先了解了[ ...
- 20155231 实验三 敏捷开发与XP实践
20155231 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器&g ...
- su的使用与退出
偶尔用回到ubuntu系统,想切换到su,总是显示不成功,也许是初次使用,即需要设定一下: 使用sudo $:sudo passwd 系统提示输入密码,即安装时的用户密码,然后,系统提示输入两次新密码 ...
- 【LG3243】[HNOI2015]菜肴制作
题面 洛谷 题解 首先我们有个非常显然的思路, 就是直接拓扑排序,用小根堆代替队列再按顺序输出,但是很显然是错的, 因为这只保证了字典序最小,而无法保证答案最优,\(<2,4>,<3 ...
- rem布局注意问题和meta标签
使用rem前的准备: 如果是移动端,添加name="viewport"的meta标签,其中的属性数值根据实际需求而定: <meta name="viewport&q ...