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 ...
随机推荐
- 原生Js写轮播图代码
html css js 在知道jQuery如何实现轮播效果的基础上,用js写代码 如图:标记这里的地方 理解一下 用到的知识: 1.HTML DOM 的appendChild() 和 removeCh ...
- page1
1.1 常用的客户端技术:HTML. CSS. 客户端脚本技术 1.2 常用的服务器端技术:CGI .ASP .PHP (一种开发动态网页技术).ASP.NET(是一种建立动态web应用程序的技术,是 ...
- Java中next()和nextLine()
next()读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键 ...
- CF | Alyona and Numbers
After finishing eating her bun, Alyona came up with two integers n and m. She decided to write down ...
- Node.js HTTP
稳定性: 3 - 稳定 使用 HTTP 服务器或客户端功能必须调用 require('http'). Node 里的 HTTP 接口支持协议里原本比较难用的特性.特别是很大的或块编码的消息.这些接口不 ...
- Go 语言函数
函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回类型,和参数. ...
- EBS业务学习之应付INVOICE类型
INVOICE类型 类 型 描 述 标准INVOICE 是指由于采购货物或接受劳务,从供应商处取得的INVOICE (标准INVOICE,既可以和订单匹配,也可以不匹配) ...
- Hadoop介绍
是适合大数据的分布式存储与计算平台,用java编写的开源系统,能够安排在大规模的计算机平台上,从而长进计算效率:由 HDFS.MapReduce.HBase.Hive 和 ZooKeeper等成员组成 ...
- JSP简单隔行变色和日期格式化
以前好像在找,都没找到简单点的,所以后面就自己写了一个,感觉超级简单又好理解,分享给大家 <%@ page language="java" import="java ...
- Java基本语法-----java进制的转换
进制: 进制是一种记数方式 ,可以用有限的数字符号代表所有的数值.由特定的数值组成. 1整型的表现形式 1.十进制: 都是以0-9这九个数字组成,不能以0开头. 2.二进制: 由0和1两个数字组成. ...