SpringMVC笔记
一、常用注解类:
注意:使用注解之前,一定要spring-mvc.xml配置文件中配置
<context:componet-scan/>
扫描注解。
例如:
<context:component-scan base-package="com.ztz" />
即扫描 com.ztz 包及其子包下的所有注解。
- Controller : 控制器类,标识该类为控制器类
RequestMapping : 可用于控制器类定义和方法定义处,就是一个映射,如果定义在类上,相当于struts2中的配置文件中包的命名空间,如果定义在方法上,相当于struts2中一个action的名字。
属性:value, method, consumes, produces, params, headers(1) value:请求方法的路径,如果不带其他属性,value可以省略,
@RequestMapping("/login") 的格式,它等同于@RequestMapping(value = "/login")
(2) method:请求的方式,有POST、GET、PUT、DELETE等,如果不写,表示接受任意请求方式。也可以使用数组指定多个请求方式
@RequestMapping(value = "/login", method = {RequestMethod.POST, RequestMethod.GET})
(3)consumes:指定请求提交内容的类型(Content-Type),可以是application/json、text/html等,当然它可以是一个字符串或者是一个字符串数组
@RequestMapping(value = "/login",consumes={“application/json”, “text/html”})
(4) produces:指定返回的内容类型,和consumes类似。可以是数组也可以是一个字符串。
(5)param:表示某个请求必须包含该 参数=值 才会触发该方法
@RequestMapping(value = "/login",param=“param=value”)
表示只有当参数param等于value时才可以触发该方法,其中=可以换成!= ,表示当参数param不等于value时才会执行该方法。同样,也可以时数组也可以时字符串。当然也可以不指定具体参数的值,只有一个paramName,表示必须有此参数才会触发该方法。也可以使用!paramName,表示没有此参数时才会触发。
(6)header:请求头Header中必须包含某些指定的参数值才会触发该方法。
@RequestMapping(value = "/login",header= “content-type=text/*”)
占位符
Componet 当不确定一个类是控制类还是Service类还是DAO类,使用该注解。
- Service 标识一个类为业务逻辑类
Repository 标识一个类为DAO类
AutoWired和Resource注解的异同
推荐使用Resource注解。
二、其他注解类:
PathVariable:当RequestMapping使用动态参数时配合其使用。
最后一个使用了正则表达式- RequestParam : SpringMVC在后台获取参数的方式有两种
一种是 request.getParameter(“name”);
另一种就是使用RequestParam注解
属性:value、required、defaultValue
注意:参数类型尽量不要使用int,long而是其对应的包装类Integer、Long
(3) CookieValue
(4) SessionAttributes
(5) ResponseBody
(6) RequestHeader
三、SpringMVC数据校验
概述:
JSR 303 用于对Java Bean 中的字段的值进行验证,使得验证逻辑从业务代码中脱离出来。
是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回
一般用于表单提交页面(如用户名必填、只能由数字字母组成等等)
JSR 303 校验框架注解类:
Hibernate Validator扩展注解类:
实现数据校验步骤:
1、在pom.xml中添加以下jar包依赖
<!-- 自动加载 validation-api依赖和sl4j相关依赖-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<!-- 自动加载 validation-api依赖和sl4j相关依赖-->
2、在spring-mvc.xml中配置
<!-- validator引用自定义,为了实现国际化-->
<mvc:annotation-driven validator="validator" />
<!-- 下面这两个是为了实现国际化的配置-->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!--
basename引用的是 resources文件夹下的i18n文件夹下的messages文件,一共有两个
一个是messages.properties,一个是messages_zh_CN.properties
-->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="i18n/messages" />
3、在成员变量上添加注解
public class User implements Serializable {
//message="{...}" 这是为了实现国际化,如果没有要求,可以直接写你要提示的信息
//非空验证
@NotEmpty(message="{NotEmpty.user.userName}")
private String userName ;
//通过 正则表达式验证
@Pattern(regexp="[0-9a-zA-Z]{6,30}", message="{Pattern.user.password}")
private String password ;
//长度限制验证
@Length(min=2, max=100, message="{Length.user.realName}")
private String realName ;
//邮箱验证
@Email(message="{Email.user.email}")
private String email ;
@NotNull(message = "{NotNull.user.age}")
//范围验证
@Between(min = 18, max = 45)
private Integer age ;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
4、在Controller测试
注册的JSP代码
<form action="doRegister.html" method="post">
<p>
${ERR_userName }<br>
<span>用户名:</span><input type="text" name="userName">
</p>
<p>
${ERR_password }<br>
<span>密 码:</span><input type="password" name="password">
</p>
<p>
${ERR_realName }<br>
<span>真实姓名:</span><input type="text" name="realName">
</p>
<p>
${ERR_email }<br>
<span>邮 箱:</span><input type="text" name="email">
</p>
<p>
${ERR_age }<br>
<span>年 龄:</span><input type="text" name="age">
</p>
<p>
<input type="submit" value="注册">
</p>
</form>
Controller代码
@RequestMapping(value = "/doRegister", method = RequestMethod.POST)
//这里添加了一个 @Valid 注解,标识要对user参数进行验证,result用来收集验证结果,map相当于一个session
public String doLogin(@Valid User user, BindingResult result, ModelMap map){
// 如果入参有问题,返回注册页面
if (result.hasErrors()) {
List<FieldError> errorList = result.getFieldErrors();
for(FieldError error : errorList){
System.out.println(error.getField() + "*" + error.getDefaultMessage());
map.put("ERR_" + error.getField(), error.getDefaultMessage());
}
return "/WEB-INF/jsp/register.jsp";
}
// 这里省略注册代码
return "/WEB-INF/jsp/registersuccess.jsp";
}
四、SpringMVC中的拦截器与异常处理
1、装配与自定义拦截器
通常作用于 日志记录、权限检查、性能监控、通用行为
2、定义一个Interceptor类两种方式:
(1)、实现HandlerInterceptor或者继承HandlerInterceptoradapter
(2)、HandlerInterceptor中的三个方法
A、 preHandle(HttpServletRequest request,HttpServletResponse response,Object handle); 请求处理之前调用。
B、 postHandle(HttpServletRequest request,HttpServletResponse response,Object handle,ModelAndView modelAndView); 请求处理之后调用。
C、 afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handle,Exception ex); 整个请求结束后(渲染了对应的视图之后)调用。
3、 配置拦截器
五、异常处理
六、SpringMVC与数据库的交互
1、 JdbcTemplate连接数据库
2、 Mybatis框架连接数据库
待续。。。。。
内容未完,结束线先行
—————————-这里是结束线—————————————
– 2017-08-02 11:20