SpringMVC注解控制器详解
主要包括四类:@Component、@Repository @Service、@Controller
说明:
@Controller 控制层,就是我们的action层
@Service 业务逻辑层,就是我们的service或者manager层
@Repository 持久层,就是我们常说的DAO层
@Component (字面意思就是组件),它在你确定不了事哪一个层的时候使用。
其实,这四个注解的效果都是一样的,Spring都会把它们当做需要注入的Bean加载在上下文中;但是在项目中,却建议你严格按照除Componen的其余三个注解的含义使用在项目中。这对分层结构的web架构很有好处。
示例:
1. 控制层
@Controller // 注释为controller
@Scope("prototype")
public class LoginAction {
@Autowired
@Qualifier("userService") //注释指定注入 Bean
private IUserService userService;
@RequestMapping(value = "/login/{username}", method = RequestMethod.GET)
public ModelAndView myMethod(HttpServletRequest request, HttpServletResponse response,
@PathVariable("username") String username, ModelMap modelMap) throws Exception {
modelMap.put("loginuser", username);
return new ModelAndView("/login", modelMap);
}
@RequestMapping(value = "/welcome", method = RequestMethod.GET)
public String registPost(User user) {
return "/welcome";
}
}
参数:
userName=xxx&password=yyy
----------------
class User{
private String userName;
private String password;
}
(1)LoginAction使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当有请求的时候都创建一个Action对象。
(2)@PathVariable("user") String user是url中变量的获取。
(3)常用注解@Controller、@RequestMapping、@RequestParam、@PathVariable、@CookieValue
(4)常见的参数类型
1).HttpServletRequest、HttpServletResponse或HttpSession。
2).添加了@RequestParam注解的任意类型的请求参数
3).添加了@ModelAttribute注解的任意类型的模型属性
4).任意类型的命令对象,供Spring绑定请求参数
5).Map或者ModelMap,供处理程序方法向模型添加属性
6).Errors或者BindingResult,让处理程序方法访问命令对象的绑定和验证结果
7).SessionStatus,让处理程序方法发出会话处理已经完成的通知
(5)常见的返回值类型
处理程序方法的返回类型可以是ModelAndView、Model、Map、String、void
2. 业务逻辑层
@Service("userService")
public class UserServiceImpl implements IUserService {
@Autowired
@Qualifier("userDao")
private IUserDao userDao;
...
}
(1)@Autowired暴露的required属性,这是承担着依赖性检查任务的重要属性。默认时,凡是应用了@Autowired注解的属性和方法都必须找到合适的协作者,否则DI容器会抛出异常,通过调整required属性取值能够改变这一行为,当@Autowired注解的required属性设置为false时,即使未找到合适的协作者,异常都始终不会被抛出。
(2)@Autowired注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即setter方法,常见的各种方法都可以应用这一注解。
3. 持久层
@Repository("userDao")
public class UserDaoImpl implements IUserDao {
private static Logger logger = LoggerFactory.getLogger(UserDaoImpl.class);
private DataSource dataSource;
private JdbcTemplate template;
@Autowired
public UserDaoImpl(DataSource dataSource){
this.dataSource= dataSource;
template = new JdbcTemplate(this.dataSource);
}
4. 持久层
@Component("component")
public class TestCompoment {
@Autowired
private ApplicationContext ctx;
public ApplicationContext getCtx() {
return ctx;
}
}
(1)在类上使用@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符。
(2)这是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
5.其他常用如下:
@SuppressWarnings
##作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。
@Controller
##是告诉Spring容器,这是一个控制器类
@RequestMapping(value="/account.do")
##是来定义该控制器对应的请求路径(/account.do)
@Autowired
##完成注入依赖,默认是按照类型装配注入的
@Resource
##完成注入依赖,默认是按照名称来装配注入的
@Service
##用于标识这是一个Service层实现
@Transactional(readOnly = false, rollbackFor = DataAccessException.class)
##用于控制事务,只读关闭,遇到DataAccessException异常回滚。
##如果不对异常进行处理,该异常将一直向上层抛出,直至抛出到页面
<!-- 请求/返回参数绑定 -->
@RequestMapping(method = RequestMethod.GET)
##指定这个方法为get请求时调用
@RequestMapping(method = RequestMethod.POST)
##指定该方法接受post请求
@RequestParam
##绑定参数名
public void hello(@RequestParam("username") String u, @RequestParam("password") String p) {...}
##请求参数类型要求:
ServletRequest/ServletResponse/HttpSession/Principal/Locale/InputStream/OutputStream/Reader/Writer
##返回值类型要求:
ModelAndView/Model/View/Map/String/null
<!-- 返回参数页面绑定 -->
@SessionAttributes("msg")
##将ModelMap中的某个参数指定到Session中,将其绑定为Session属性
##页面使用:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:out value="${msg}"></c:out>
或者
model.put("msg", account);
##定义即将传出的参数account
<c:out value="${account.username}" />
<!-- form表单绑定 -->
<form:form commandName="account">
<form:hidden path="id" />
<ul>
<li><form:input path="username" /></li>
<button type="submit">登录</button>
</li>
</ul>
</form:form>
##控制层代码:
@RequestMapping(method = RequestMethod.POST)
public String login(@ModelAttribute("account") Account account) {...}
<!-- JSON处理 -->
@ResponseBody
##将HTTP请求正文转换为适合的HttpMessageConverter对象
@RequestBody
##将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流
HttpMessageConverter
##HttpMessageConverter接口,需要开启<mvc:annotation-driven />
AnnotationMethodHandlerAdapter
##AnnotationMethodHandlerAdapter会初始化7个转换器,可以通过调用getMessageConverts()方法来获取转换器的一个集合List<HttpMessageConverter>
ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter
XmlAwareFormHttpMessageConverter
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter
##Spring默认的json协议解析由Jackson完成
<!-- 应用路径 -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>spring.webapp.root</param-value>
</context-param>
-------------------------------------------
${spring.webapp.root}
##指代当前应用路径
<!-- 配置文件属性绑定 -->
@Value("/WEB-INF/database.properties")
private File databaseConfig;
##引入配置文件中的参数
@Value("${jdbc.url}")
private String url;
##若配置文件已被容器加载,可直接访问其中变量
@ImportResource("/WEB-INF/database.properties")
public class AccountDaoImpl extends AccountDao {
##只有一个类使用配置文件
<!-- 测试 -->
@ContextConfiguration(locations = "classpath:applicationContext.xml")
##导入配置文件,Spring-Test的这个配置只认classpath,必须拷贝这些文件到根目录!
@RunWith(SpringJUnit4ClassRunner.class)
##SpringJUnit支持,由此引入Spring-Test框架支持!
@Transactional
##这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
##这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时指定自动回滚(defaultRollback = true)。
public abstract class AbstractTestCase extends AbstractTransactionalDataSourceSpringContextTests
##要想构建这一系列的无污染纯绿色事务测试框架就必须找到这个基类
SpringMVC注解控制器详解的更多相关文章
- SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解 博客分类: 跟开涛学SpringMVC 6.6.2.@RequestParam绑定单个请求参数值 @RequestParam用于 ...
- 转:springmvc常用注解标签详解
Spring5:@Autowired注解.@Resource注解和@Service注解 - IT·达人 - 博客园--这篇顺序渐进,讲得超级好--此人博客很不错http://www.cnblogs.c ...
- Java 注解用法详解——@SuppressWarnings
转自: https://www.cnblogs.com/fsjohnhuang/p/4040785.html Java魔法堂:注解用法详解——@SuppressWarnings 一.前言 编码时我 ...
- @SuppressWarnings注解用法详解
@SuppressWarnings注解用法详解 今天来谈谈@SuppressWarnings注解的作用. J2SE 提供的最后一个批注是 @SuppressWarnings.该批注的作用是给编译器一条 ...
- Spring 注解@Value详解
一.spring(基础10) 注解@Value详解[1] 一 配置方式 @value需要参数,这里参数可以是两种形式: [html] view plain copy @Value("#{co ...
- Java注解(Annotation)详解
转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...
- springmvc常用注解标签详解
1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...
- springmvc常用注解标签详解【转】
转载自:http://www.cnblogs.com/leskang/p/5445698.html 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由Disp ...
- springmvc常用注解标签详解(转载)
1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...
随机推荐
- python解析json文件之简介
一.JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition ...
- String字符串的操作
字符串的常用操作 # Author:nadech name = "my name is nadech" print(name.count("a")) print ...
- 深度解读GoogleNet之Inception V1
GoogleNet设计的目的 GoogleNet设计的初衷是为了提高在网络里面的计算资源的利用率. Motivation 网络越大,意味着网络的参数较多,尤其当数据集很小的时候,网络更容易发生过拟合. ...
- ActionContext.getContext()用法
为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了 ...
- lucene创建索引
创建索引. 1.lucene下载. 下载地址:http://archive.apache.org/dist/lucene/java/. lucene不同版本之间有不小的差别,这里下载的是lucene ...
- JDK 源码学习——ByteBuffer
ByteBuffer 在NIO的作用 Java SE4 开始引入Java NIO,相比较于老的IO,更加依赖底层实现.引入通道(Channels),选择器(selector),缓冲(Buffers). ...
- Redis源码剖析--源码结构解析
请持续关注我的个人博客:https://zcheng.ren 找工作那会儿,看了黄建宏老师的<Redis设计与实现>,对redis的部分实现有了一个简明的认识.在面试过程中,redis确实 ...
- 为什么选择C++
为什么选择C++,怎么不选其它语言呢? 为什么不选择C? 因为C++比C简单点~ 为什么不选择C#? 因为C++可以在所有操作系统上使用. 为什么不选择JAVA? 因为C++的性能好一点~ 还有其他的 ...
- Xcode一种涉及到多桌面的调试技巧
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Mac本身是支持多桌面功能的,以下是本猫OS界面的截图: 可以 ...
- iPhone全部设备分辨率速查
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...