test

114 阅读6分钟

RequestMapping

类上: 请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。

方法上: 请求 URL 的第二级访问目录。

属性:

value:用于指定请求的 URL。它和 path 属性的作用是一样的。 method:用于指定请求的方式。 params:用于指定限制请求参数的条件。

params = {"accountName"},表示请求参数必须有 accountName params = {"moeny!100"},表示请求参数中 money 不能是 100。

请求参数的绑定

<form action="account/saveAccount" method="post">
    账户名称:<input type="text" name="name" ><br/>
    账户金额:<input type="text" name="money" ><br/>
    账户省份:<input type="text" name="address.provinceName" ><br/>
    账户城市:<input type="text" name="address.cityName" ><br/>
    <input type="submit" value="保存">
</form>


@RequestMapping("/saveAccount")
public String saveAccount(Account account) {
    System.out.println("保存了账户。。。。"+account);
    return "success";
}

POJO 类中包含集合类型参数

public class User implements Serializable {
    private String username;
    private String password;
    private Integer age;
    private List<Account> accounts;
    private Map<String,Account> accountMap;
}
public class Account implements Serializable {
    private Integer id;
    private String name;
    private Float money;
    private Address address;

}

<form action="account/updateAccount" method="post">
用户名称:<input type="text" name="username" ><br/>
用户密码:<input type="password" name="password" ><br/>
用户年龄:<input type="text" name="age" ><br/>
账户 1 名称:<input type="text" name="accounts[0].name" ><br/>
账户 1 金额:<input type="text" name="accounts[0].money" ><br/>
账户 2 名称:<input type="text" name="accounts[1].name" ><br/>
账户 2 金额:<input type="text" name="accounts[1].money" ><br/>
账户 3 名称:<input type="text" name="accountMap['one'].name" ><br/>
账户 3 金额:<input type="text" name="accountMap['one'].money" ><br/>
账户 4 名称:<input type="text" name="accountMap['two'].name" ><br/>
账户 4 金额:<input type="text" name="accountMap['two'].money" ><br/>
<input type="submit" value="保存">
</form>


控制器代码:
/**
* 更新账户
* @return
*/
@RequestMapping("/updateAccount")
public String updateAccount(User user) {
    System.out.println("更新了账户。。。。"+user);
    return "success";
}

请求参数乱码问题

post 请求方式:
在 web.xml 中配置一个过滤器
<!-- 配置 springMVC 编码过滤器 -->
 
<filter>
 
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>
    org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    
    <!-- 设置过滤器中的属性值 -->
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>

    <!-- 启动过滤器 -->
    <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
 
</filter>
 
<!-- 过滤所有请求 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

在 springmvc 的配置文件中可以配置,静态资源不过滤:
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>



get 请求方式:
tomacat 对 GET 和 POST 请求处理方式是不同的,GET 请求的编码问题,要改 tomcat 的 server.xml
配置文件,如下:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>
改为:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true"/>
如果遇到 ajax 请求仍然乱码,请把:
useBodyEncodingForURI="true"改为 URIEncoding="UTF-8"
即可。

自定义类型转换器

第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。


public interface Converter<S, T> {//S:表示接受的类型,T:表示目标类型
    /**
    *

    实现类型转换的方法
    */
    @Nullable
    T convert(S source);
    }
    /**
    * 自定义类型转换器
    * @author 黑马程序员
    * @Company http://www.ithiema.com
    * @Version 1.0
    */
    


public class StringToDateConverter implements Converter<String, Date> {
    /**
    * 用于把 String 类型转成日期类型
    */
    @Override
    public Date convert(String source) {
        
        DateFormat format = null;   
        try {
            if(StringUtils.isEmpty(source)) {
                throw new NullPointerException("请输入要转换的日期");
            }
            format = new SimpleDateFormat("yyyy-MM-dd");
            Date date = format.parse(source);
            return date;
        } catch (Exception e) {
            throw new RuntimeException("输入日期有误");
        }
    }
}
第二步:在 spring 配置文件中配置类型转换器。
    spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。


<!-- 配置类型转换器工厂 -->
<bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    
<!-- 给工厂注入一个新的类型转换器 --> 
<property name="converters">
    
    <array>
    <!-- 配置自定义类型转换器 -->
    <bean class="com.itheima.web.converter.StringToDateConverter"></bean>

    </array>
 
</property>
</bean>


第三步:在 annotation-driven 标签中引用配置的类型转换服务
 
<!-- 引用自定义类型转换器 -->
<mvc:annotation-driven
conversion-service="converterService"></mvc:annotation-driven>

常用注解

RequestParam

作用: 把请求中指定名称的参数给控制器中的形参赋值。

属性: value:请求参数中的名称。 required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String username, @RequestParam(value="age",required=false)Integer age){
    System.out.println(username+","+age);
    return "success";
}

RequestBody

作用: 用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。 get 请求方式不适用。

属性: required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null。

<!-- request body 注解 -->
<form action="springmvc/useRequestBody" method="post">
用户名称:<input type="text" name="username" ><br/>
用户密码:<input type="password" name="password" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>
get 请求 jsp 代码:
<a href="springmvc/useRequestBody?body=test">requestBody 注解 get 请求</a>


控制器代码:
/**
* RequestBody 注解
* @param user
* @return
*/
@RequestMapping("/useRequestBody")
public String useRequestBody(@RequestBody(required=false) String body){
System.out.println(body);
return "success";
}

PathVaribale

作用: 用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。 url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。 属性: value:用于指定 url 中占位符名称。 required:是否必须提供占位符。

jsp 代码:
<!-- PathVariable 注解 -->
<a href="springmvc/usePathVariable/100">pathVariable 注解</a>


控制器代码:
/**
* PathVariable 注解
* @param user
* @return
*/
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
    System.out.println(id);
    return "success";
}


RequestHeader

作用: 用于获取请求消息头。 属性: value:提供消息头名称 required:是否必须有此消息头

jsp 中代码:
<!-- RequestHeader 注解 -->
<a href="springmvc/useRequestHeader">获取请求消息头</a>
控制器中代码:
/**
* RequestHeader 注解
* @param user
* @return
*/
@RequestMapping("/useRequestHeader")
public String useRequestHeader(@RequestHeader(value="Accept-Language",required=false)String requestHeader){
    System.out.println(requestHeader);
    return "success";
}

CookieValue

作用: 用于把指定 cookie 名称的值传入控制器方法参数。 属性: value:指定 cookie 的名称。 required:是否必须有此 cookie。

jsp 中的代码:
<!-- CookieValue 注解 -->
<a href="springmvc/useCookieValue">绑定 cookie 的值</a>
控制器中的代码:
/**
* Cookie 注解注解
* @param user
* @return
*/
@RequestMapping("/useCookieValue")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false) String cookieValue){
    System.out.println(cookieValue);
    return "success";
}

ModelAttribute

作用: 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可 以修饰有具体返回值的方法。 出现在参数上,获取指定的数据给参数赋值。 属性: value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。 应用场景: 当表单提交数据不是完整的实体类数据时,可以调用方法填充完整数据