目录
HelloWorld
导入jar包
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
在web.xml中配置DispatcherServlet
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
创建SpringMVC的配置文件
注意:文件名要与<servlet-name标签的值相对应,文件名称为servlet-name-servlet,例如我的值是springMVC,那么我的配置文件的名称应该为springMVC-servlet.xml
首先配置扫描的包把加上@Controller注解的类作为springMVC的控制层,然后再配置视图解析器,这里视图解析器的作用是
prefix + 视图名称 + suffix 作为要跳转的页面
<context:component-scan base-package="com.atguigu.test"></context:component-scan>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
创建控制层的类
创建HelloWorld类,然后加上@Controller类,证明是控制层的,然后创建hello()方法,在上面加上@RequestMapping注解,注解中填入一个“hello”表示访问路径,这样访问http://localhost:8080/SpringMVC01_Test/hello的时候就会被这个方法处理。
@Controller
public class HelloWorld {
@RequestMapping("hello")
public String hello() {
System.out.println("访问了hello");
return "success";
}
}
@RequestMapping注解
概述
@RequestMapping注解是设置请求映射,就是吧请求的url和控制层的方法联系起来,设置映射关系。这个注解可以加在类上也可以加在方法上,访问的时候需要一层一层的访问,先访问类上的,再访问方法上的。
value属性
value属性用来标识,当请求的url和value属性的值一致时就会把该请求映射到该方法上,使用该方法来进行处理。例如访问路径为hello的时候,就会被hello()方法进行处理。
@RequestMapping("hello")
public String hello() {
System.out.println("访问了hello");
return "success";
}
method属性
method属性用来设置请求的方式,即使用什么方式请求的时候才能被该方法处理,例如下面的两个的url都是hello,但是如果以get方式反访问的时候就被hello()方法处理,以post方式访问的时候就被helloPost()方法处理。
@RequestMapping(value = "hello",method = RequestMethod.GET)
public String hello() {
System.out.println("get方式访问了hello");
return "success";
}
@RequestMapping(value = "hello",method = RequestMethod.POST)
public String helloPost() {
System.out.println("post方式访问了hello");
return "success";
}
params属性
params属性用来筛选客户端传到服务器的值,支持表达式,比如下面的按照顺序分别为传入的参数必须有username、传入的参数不能有age、传入的参数必须有username并且值必须为admin、传入的username的值不能为root.
@RequestMapping(value = "hello",params = {"username","!age","username=admin","username!=root"})
public String helloPost() {
System.out.println("post方式访问了hello");
return "success";
}
headers属性
用来筛选请求头,客户端所发送的请求头要和设置的一致才能正常访问,比如下面的例子中请求头中必须有Accept-Language=zh-CN,zh;q=0.9才可以正常访问。
@RequestMapping(value = "hello",headers = {"Accept-Language=zh-CN,zh;q=0.9"})
public String helloPost() {
System.out.println("post方式访问了hello");
return "success";
}
支持Ant路径风格
在SpringMVC中支持Ant方式的请求路径,有三个匹配符,分别为
*:任意字符
?:任意一个字符
**:任意多层目录
@RequestMapping(value="/*/ant??/**/testAnt")
public String testAnt() {
System.out.println("SUCCESS:testAnt");
return "success";
}
映射请求占位符PathVariable注解
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中
url中使用{xxx}来占位
参数中使用 @PathVariable(“xxx”) 绑定到操作方法参数中
注意二者的xxx要相同
@RequestMapping(value = "hello/{id}/{username}")
public String test(@PathVariable("id") Integer id,@PathVariable("username") String username) {
System.out.println("id:,"+id+"username:"+username);
return "success";
}
REST
具体说,REST就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
使用步骤:
web.xml中配置过滤器
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
编写处理方法
编写处理方法,这里以put为例,method方法为put,如果报错的话可以加上@ResponseBody注解
@RequestMapping(value = "rest",method = RequestMethod.PUT)
@ResponseBody
public String testREST() {
System.out.println("put");
return "success";
}
设置form表单
要注意一定要有一个name为_method的隐藏域,value值为要使用的方式。
<form action="rest" method="post">
<input type="hidden" name="_method" value="put">
<input type="submit">
</form>
处理请求数据
加入名字一样的形参
在处理请求的方法中,加入名字相同的形参就可以自动赋值,比如在参数中加入username就可获取客户端传过来的username的值
@RequestMapping("param")
public String param(String username ) {
System.out.println(username);
return "success";
}
@RequestParam注解
如果名字不相同不能自动赋值则可以通过@RequestParam注解在获取参数的时候重新设置参数的变量名。
value:当不满足赋值条件时,可以使用value属性,指定映射关系
required:设置形参是否必须被赋值,默认为true,必须赋值,若设置为false,则不必须赋值,因此形参的值为null
defaultValue:若形参所获得的值为null,则设置一个默认值,用在分页和模糊查询中
@RequestMapping("param")
public String param(@RequestParam(value = "username",required = false ,defaultValue = "root") String name ) {
System.out.println(name);
return "success";
}
@RequestHeader 注解
可以获取请求头的信息
@RequestMapping("head")
public String head(@RequestHeader("Accept-Language") String Accept ) {
System.out.println(Accept);
return "success";
}
@CookieValue 注解
可以获取cookie的信息
@RequestMapping("cookie")
public String cookis(@CookieValue("JSESSIONID") String cookie ) {
System.out.println(cookie);
return "success";
}
使用POJO作为参数
可以使用POJO获取客户端数据,要求实体类对象中的属性名一定要和页面中表单元素的name属性值一致,且支持级联关系
1.创建两个javabean,User类包含以下属性:
private Integer id;
private String username;
private String password;
private Integer age;
private Address address;
User中其中有一个属性是Address 类型的,再创建Address类:
private String provice;
private String city;
private String country;
2.jsp中,name属性和User类中的相同,Address属性使用.的形式级联对应起来
<form action="param" method="post">
username:<input type="text" name="username" ><br>
password:<input type="text" name="password" ><br>
age:<input type="text" name="age" ><br>
provice:<input type="text" name="address.provice" ><br>
city:<input type="text" name="address.city" ><br>
country:<input type="text" name="address.country" ><br>
<input type="submit">
</form>
3.controller中直接将User user作为形参,就会自动赋值了
@RequestMapping(value = "/param",method = RequestMethod.POST)
public String paream(User user) {
System.out.println(user);
return "success";
}
使用Servlet原生API作为参数
在处理函数中直接将相应的ServletAPI 做为参数就会自动赋值然后使用了,可以支持以下九种
- HttpServletRequest
- HttpServletResponse
- HttpSession
- java.security.Principal
- Locale
- InputStream
- OutputStream
- Reader
- Writer
@RequestMapping(value = "/param",method = RequestMethod.POST)
public String paream(HttpServletRequest req,HttpServletResponse resp) {
String username = req.getParameter("username");
System.out.println(username);
return "success";
}
处理响应数据
Spring中提供了三种方法输出模型数据,不管使用以下哪种方式,最终都会把Model数据和view数据封装到MaodelAndView中
1) ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
2) Map 或 Model: 入参为 org.springframework.ui.Model、
org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
ModelAndView
@RequestMapping(value = "/param",method = RequestMethod.POST)
public ModelAndView paream() {
ModelAndView mav = new ModelAndView();
mav.addObject("username", "root");//往request域中放值
mav.setViewName("success");//设置视图名称实现页面跳转
return mav;
}
Map
@RequestMapping(value = "/param",method = RequestMethod.POST)
public String paream(Map<String,Object> map) {
map.put("username", "admin");//向作用域放值
return "success";//返回视图名称
}
Model
@RequestMapping(value = "/param",method = RequestMethod.POST)
public String paream(Model model) {
model.addAttribute("username","root");
return "success";//返回视图名称
}