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 ...
随机推荐
- Swift 3.0项目迁移的一些记录
刚执行完Convert后报错600+,真是令人奔溃. 之后重新编译,仔细分析后发现其实真实错误远没有那么多.最终实际修改到的错误也就几十个,而且其中某些还是同一种错误. 这个项目是一个供自己使用的浏览 ...
- 码农代理免费代理ip端口字段js加密破解
起因 之前挖过爬取免费代理ip的坑,一个比较帅的同事热心发我有免费代理ip的网站,遂研究了下:https://proxy.coderbusy.com/. 解密 因为之前爬过类似的网站有了些经验,大概知 ...
- ng-book札记——Angular工作方式
Angular应用由组件(Component)构成.它与AngularJS中的指令相似(directive). 应用 一个Angular应用本质上是一个组件树.在组件树的顶层,最上级的组件即是应用本身 ...
- jQuery – AJAX get() 和 post() 方法
jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据. HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方 ...
- Docker配置 DNS
Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢? 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件. 在容器中使用 mount 命令可以看到挂载信 ...
- Bootstrap3 栅格系统-列偏移
使用 .col-md-offset-* 类可以将列向右侧偏移.这些类实际是通过使用 * 选择器为当前元素增加了左侧的边距(margin).例如,.col-md-offset-4 类将 .col-md- ...
- ECharts, PHP, MySQL, Ajax, JQuery 实现前后端数据可视化
ECharts 下载js代码 工作原理浅析 在项目中引入ECharts 后台处理 数据库端MySQL PHP端 JQuery Ajax处理 ECharts 端处理 前端全部代码 演示结果 总结 最近要 ...
- 使用spark ml pipeline进行机器学习
一.关于spark ml pipeline与机器学习 一个典型的机器学习构建包含若干个过程 1.源数据ETL 2.数据预处理 3.特征选取 4.模型训练与验证 以上四个步骤可以抽象为一个包括多个步骤的 ...
- 2.4、Android Studio使用主题编辑器设计主题
Android Studio包含一个叫主题编辑器的可视的助手,可以提供以下功能: 1. 创建和更改你的app主题 2. 为不同的资源适应主题 3. 普通的UI颜色更改的实时显示 主题编辑器 这一节描述 ...
- Android简易实战教程--第十七话《自定义彩色环形进度条》
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/52203533 点击打开链接 在Android初级教程里面,介绍了shape用法 ...