SpringMvc学习

1、@Resource:属性注入时使用

2、 @RequestBody

作用:

      i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

      ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

  •     application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
  •     multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
  •     其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

  •     application/x-www-form-urlencoded, 必须;
  •     multipart/form-data, 不能处理;
  •     其他格式, 必须;

说明:request的body部分的数据编码格式由header部分的Content-Type指定;

3、@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

(1) value, method;

value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);

method:  指定请求的method类型, GET、POST、PUT、DELETE等;

(2)consumes,produces;

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

(3) params,headers;
params: 指定request中必须包含某些参数值是,才让该方法处理。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

4、@Component @Controller @Service @Repository的作用

1、@controller 控制器(注入服务
2、@service 服务(注入dao
3、@repository dao(实现dao访问
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id=”” class=””/>)
@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。
下面写这个是引入component的扫描组件

1
<context:component-scan base- package = "com.iitshare" />

其中base-package为需要扫描的包,可以包括下面的子包,比如:com.iitshare.hapishop、com.iitshare.hapicms
1、@Service用于标注业务层组件
2、@Controller用于标注控制层组件(如struts中的action)
3、@Repository用于标注数据访问组件,即DAO组件.
4、@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
@RequestMapping ( "/admin/log" ) public class LogController extends 
     BaseController {
      
} @Service ( "logServiceImpl" ) public class LogServiceImpl extends BaseServiceImpl<Log, Long> implements
         LogService {
} @Repository ( "logDaoImpl" ) public class LogDaoImpl extends BaseDaoImpl<Log, Long> implements 
     LogDao {
}

getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“***”)这样来指定。这种bean默认是单例的,如果想改变,可以使用以下方法:
@Service(“beanName”)
@Scope(“prototype”)来改变。
可以使用以下方式指定初始化方法和销毁方法(方法名任意):
@PostConstruct public void init() { }

5、使用@Valid @RequestBody 的用意在于抛出notvalid的异常

6、Spring是如何寻找最佳的HttpMessageConverter

(1)首先获取注册的所有HttpMessageConverter集合

(2)然后客户端的请求header中寻找客户端可接收的类型,

比如 Accept application/json,application/xml等,组成一个集合

(3)所有的HttpMessageConverter 都有canRead和canWrite方法 返回值都是boolean,看这个HttpMessageConverter是否支持当前请求的读与写,读对应@RequestBody注解, 写对应@ResponseBody注解

(4)遍历HttpMessageConverter集合与前面获取可接受类型进行匹配,如果匹配直接使用当前第一个匹配的HttpMessageConverter,然后return(一般是通过Accept和返回值对象的类型进行匹配)

例如

StringHttpMessageConverter

支持String , Accept所有类型

MappingJacksonHttpMessageConverter

支持Map List 实体对象等等 ,Accept:application/json

7、

<context-param>的作用:
web.xml的配置中<context-param>配置作用
1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>

 

2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.

 

3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.

 

4.容器创建<listener></listener>中的类实例,即创建监听.

 

5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的键");

 

6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.
换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.

 

7.举例.你可能想在项目启动之前就打开数据库.
那么这里就可以在<context-param>中设置数据库的连接方式,在监听类中初始化数据库的连接.

 

8.这个监听是自己写的一个类,除了初始化方法,它还有销毁方法.用于关闭应用前释放资源.比如说数据库连接的关闭.

 

9、在tomcat下部署两个或多个项目时,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为“webapp.root”,如下:
<!-- 应用路径  -->  
    <context-param>  
        <param-name>webAppRootKey</param-name>  
        <param-value>webapp.root</param-value>  
    </context-param>  

10、

   使用spring中的Log4jConfigListener有如如下好处: 
  (1). 动态的改变记录级别和策略,不需要重启Web应用,如《Effective Enterprise Java》所说。 
   (2). 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。 
因为系统把web目录的路径压入一个叫webapp.root的系统变量。这样写log文件路径时不用写绝对路径了. 
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/myfuse.log 
   (3). 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。 
  (4).log4jRefreshInterval为6000表示开一条watchdog线程每6秒扫描一下配置文件的变化;
11、DispatcherServlet作用

DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 具体请参考第二章的图2-1

DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

(1)、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

(2)、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);

(3)、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);

(4)、通过ViewResolver解析逻辑视图名到具体视图实现;

(5)、本地化解析;

(6)、渲染具体的视图等;

(7)、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

从以上我们可以看出DispatcherServlet主要负责流程的控制(而且在流程中的每个关键点都是很容易扩展的)。

 12、hibernate Validator的各种注解:

Bean Validation 中内置的 constraint
 
@Null  被注释的元素必须为 null
@NotNull  被注释的元素必须不为 null
@AssertTrue  被注释的元素必须为 true
@AssertFalse  被注释的元素必须为 false
@Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=)  被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)  被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past  被注释的元素必须是一个过去的日期
@Future  被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式

Hibernate Validator 附加的 constraint
@NotBlank(message =)   验证字符串非null,且长度必须大于0
@Email  被注释的元素必须是电子邮箱地址
@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内
@NotEmpty  被注释的字符串的必须非空
@Range(min=,max=,message=)  被注释的元素必须在合适的范围内

13、public void show(@RequestParam("number") String number, Map<String, Object> model) {
    model.put("account", accountRepository.findAccount(number));
}这里@RequestParam注解可以用来提取名为“number”的String类型的参数,并将之作为输入参数传入。 @RequestParam支持类型转换,还有必需和可选参数。类型转换目前支持所有的基本Java类型,你可通过定制的PropertyEditors 来扩展它的范围。下面是一些例子,其中包括了必需和可选参数:
@RequestParam(value="number", required=false) String number
@RequestParam("id") Long id
@RequestParam("balance") double balance
@RequestParam double amount 
注意,最后一个例子没有提供清晰的参数名。当且仅当代码带调试符号编译时,结果会提取名为“amount ”的参数,否则,将抛出IllegalStateException异常,因为当前的信息不足以从请求中提取参数。由于这个原因,在编码时最好显式的指定参数名。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值