一.搭建spring mvc 的hello world
1.添加jar包:
commons-logging-1.1.1.jar
spring-aop-4.1.6.RELEASE.jar
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
spring-web-4.1.6.RELEASE.jar
spring-webmvc-4.1.6.RELEASE.jar
至少这8个。
2.在web.xml里配置拦截servlet:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 配置 DispatcherServlet -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
其中:
<!-- 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
用来说明配置文件的地址,在src下面的spring.xml文件,这个文件的名字可以自己定义。
3.写spring.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 配置自定义扫描的包-->
<context:component-scan base-package="com.springmvc"/>
<!--配置前缀和后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
主要有两个属性需要配置,一个是控制器controller的包,用来扫描。还有一个是资源是图解析器,用来生成视图文件的位置,跟目录是 WEB目录下。
对应jsp就是:prefix + return返回的字符串 + suffix后缀。
4.编写控制类代码,返回success,对应web目录下success.jsp文件:
@Controller
public class HelloWorld {
@RequestMapping("/hello")
public String hello() {
System.out.print("hello world");
return "success";
}
}
二.各种注解使用:
1.注解@Controller:放置在类上,用来说明这个类是控制器。
2.注解@RequestMapping:请求映射,解析url,确定请求的类和类中的方法:
1. @RequestMapping 除了修饰方法, 还可来修饰类 ,若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录
2. 1). 类定义处: 类似于package的概念。
2). 方法处: 提供进一步的细分映射信息。 相对于类定义处的 URL。
3.可以使用 method 属性来指定请求方式,这样只有post提交才会执行
/**
* 常用: 使用 method 属性来指定请求方式
*/
@RequestMapping(value = "testRequestMappingPostMethod", method = RequestMethod.POST)
public String testRequestMappingPostMethod() {
System.out.print("testRequestMappingPostMethod");
return SUCCESS;
}
4.还有params和headers属性,用来进一步确认映射关系,其中有requerid属性来确定是否必须拥有:
/**
* 了解: 可以使用 params 和 headers 来更加精确的映射请求. params 和 headers 支持简单的表达式.
*/
@RequestMapping(value = "testParams", params = {"username", "password"})
public String testParams() {
System.out.print("testParams");
return SUCCESS;
}
@RequestMapping(value = "testParamsAndHeaders", params = { "username",
"age!=10" }, headers = { "Accept-Language=en-US,zh;q=0.8" })
public String testParamsAndHeaders() {
System.out.println("testParamsAndHeaders");
return SUCCESS;
}
3.注解@PathVariable:用来获取占位符的值,可以来映射 URL 中的占位符到目标方法的参数中:
/**
* @PathVariable 可以来映射 URL 中的占位符到目标方法的参数中.
*/
@RequestMapping(value = "testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
System.out.print("testPathVariable" + id);
return SUCCESS;
}
请求的链接是:
<a href="/test/testPathVariable/121">testPathVariable</a>
121就会在参数id中。
4.注解@RequestParam:用来获取传递过来的参数
请求的链接:
<a href="/test/testRequestParams?username=zhulei&password=123456">testRequestParams</a>
处理的代码:
/**
* @RequestParam 来映射请求参数. value 值即请求参数的参数名 required 该参数是否必须. 默认为 true
* defaultValue 请求参数的默认值
*/
@RequestMapping(value = "testRequestParams")
public String testRequestParams(@RequestParam(value = "username") String username, @RequestParam(value = "password", required = false) String password) {
System.out.println("username = " + username + ";" + "password = " + password);
return SUCCESS;
}
在方法的参数上加上这个注解,对应的参数就会为传递过来的参数。
5.注解@RequestParam:用来获取请求中的头部的一些信息:
/**
* 了解: 映射请求头信息 用法同 @RequestParam
*/
@RequestMapping(value = "testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept-Language") String info) {
System.out.println("Accept-Language = " + info);
return SUCCESS;
}
这里,就是获取到了http协议,请求头部中的accept-language字段的信息,和@RequestParam用法一样,就是获取的是头部的信息
三. 常用请求方法参数方面
1.注解@CookieValue:获取coolie中的信息:
/**
* 了解:
*
* @CookieValue: 映射一个 Cookie 值. 属性同 @RequestParam
*/
@RequestMapping(value = "testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String id) {
System.out.println("JSESSIONID = " + id);
return SUCCESS;
}
2.类似第5个注解@requestparam,可以直接把表单的信息封装成一个对象来获取,这点和struts2的交互一样
前台表单:
<form action="/test/testPOJO">
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
province:<input type="text" name="address.province"><br>
city:<input type="text" name="address.city"><br>
<input type="submit" value="submit-put"><br>
</form>
处理类,接受表单的user信息,其实是调用pojo类的set方法进行设置,然后放到参数user中,支持二级映射:
/**
* Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。支持级联属性。
* 如:dept.deptId、dept.address.tel 等
*/
@RequestMapping(value = "testPOJO")
public String testPOJO(User user) {
System.out.println(user.toString());
return SUCCESS;
}
3.可以使用 Serlvet 原生的 API 作为目标方法的参数 具体支持以下类型
HttpServletRequest
HttpServletResponse
HttpSession
java.security.Principal
Locale InputStream
OutputStream
Reader
Writer
例子:
@RequestMapping(value = "testServletApi")
public String testServletApi(HttpServletRequest request, HttpServletResponse response, Writer out) throws IOException {
System.out.println(request.toString() + ";" + response.toString());
out.write("hello");
return SUCCESS;
}
直接把原生的servlet api类 当作参数,放到请求方法里,就会自动赋值,获取这些类
这里直接调用Writer,写了一个hello输出。
四.处理数据模型
第三部分是获取网页传过来的数据到java的请求方法中,做法是使用方法参数自动赋值,这部分是把处理好的数据返回给页面。
1.使用ModelAndView返回类型
/**
* 处理数据模型之ModelAndView
*/
/**
* 目标方法的返回值是 ModelAndView 类型。
* 其中可以包含视图和模型信息
* SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中.
* @return
*/
@RequestMapping(value = "testModleAndView")
public ModelAndView testModleAndView() {
String viewName = SUCCESS;
ModelAndView modelAndView = new ModelAndView(viewName);
// 填充数据
modelAndView.addObject("date", new Date());
return modelAndView;
}
SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中,这样前台就可以获取到这些值。
前台代码:
${requestScope.date}
2.使用Map作为方法参数:
/**
* 处理数据模型之Map
*/
/**
* 目标方法可以添加 Map 类型(实际上也可以是 Model 类型或 ModelMap 类型)的参数.
* @param map
* @return
*/
@RequestMapping(value = "testMap")
public String testMap(Map<String, Object> map) {
map.put("name", Arrays.asList("tom", "jerry", "zhulei"));
return SUCCESS;
}
同样,SpringMVC 会把 map 的 中数据放入到 request 域对象中,这样前台就可以获取到这些值。
3.使用注解@SessionAttributes,把数据放到session中:
这个注解只能放在类上面:
@SessionAttributes(value = {"user"}, types = {String.class})
有两个参数可以设置,value和types。
value是一个字符串数组,用来说明这个控制器类的方法中,被放入request中的数据的名字只要是定义好的,也放入session中。
types是定义类的类型,被放入request中的类的类型只要是定义好的,也放入session中
/**
* 处理数据模型之SessionAttributes
*/
/**
* @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是 value 属性值),
* 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是 types 属性值)
*
* 注意: 该注解只能放在类的上面. 而不能修饰放方法.
*/
@RequestMapping(value = "testSessionAttribute")
public String testSessionAttribute(Map<String, Object> map) {
User user = new User();
user.setUsername("zhulei");
user.setPassword("123");
map.put("user", user);
map.put("string", "stringData");
return SUCCESS;
}