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 ...
随机推荐
- HTTP与TCP的关系
一直比较想写TCP与HTTP之间的关系,HTTP报文是如何通过tcp发送的,HTTP报文形式内容如何. HTTP请求包含请求行,请求头,请求体 HTTP响应包含响应头,响应头,响应体 下面我准备通过J ...
- ACM Primes
Write a program to read in a list of integers and determine whether or not each number is prime. A n ...
- Go 语言范围(Range)
Go 语言中 range 关键字用于for循环中迭代数组(array).切片(slice).链表(channel)或集合(map)的元素.在数组和切片中它返回元素的索引值,在集合中返回 key-val ...
- Android Studio精彩案例(七)《ToolBar使用详解<一>》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 本文参考博客:http://blog.csdn.net/h_zhang/article/details/51232773 http:/ ...
- JS——2048(支持触屏及键盘操作)
<html> <head> <title>2048</title> <style type="text/css"> ta ...
- 20160214.CCPP体系详解(0024天)
程序片段(01):CGI.c 内容概要:CGI-cloud #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main01(vo ...
- An internal error occurred during: "Retrieving archetypes:". GC overhead limit exceeded
An internal error occurred during: "Retrieving archetypes:".GC overhead limit exceeded 异常, ...
- SpringMVC常用配置
关于Spring.SpringMVC我们前面几篇博客都介绍了很多,但是还不够,这些框架中涉及到的注解.配置非常多,那么我们今天再来介绍一个SpringMVC的基本配置,灵活的使用这些配置,可以让我们在 ...
- Dynamics CRM 删除字段时检测到有组件类型为查看的依赖组件而无法删除问题
今天在删除一个字段的时候报如下截图错误,点开详细信息会看到是一个快速查找视图,但却在视图列中没有找到我要删的那个字段,然后回过头来又看到组件类型是查看,这是啥类型?有点摸不着头脑了. 最后想到是不是查 ...
- activiti 多实例任务
1.1.1. 前言 个人,那么当5个人都投票的时候大概分为如下几种: 1.部门所有人都去投票,当所有人都投票完成的时候,这个节点结束,流程运转到下一个节点.(所有的人都需要投票) 2.部门所有人都去投 ...