SpringMvc
1,简介
springmvc是spring的一个后续产品,是spring的一个子项目,是spring为表示层所开发的一整套完备的解决方案,在表示层框架经历了struct、webWork、struct2等诸多产品的历代更迭之后,目前业界普遍选择了springmvc作为Java视图层开发的首先选择。springmvc是基于servlet的。
三层分别为,视图层(表示层)、业务逻辑层、数据访问层。
1,2 springmvc的特点
- spring的家族产品,与ioc容器等基础设施无缝对接
- 基于原生的servlet,通过了功能强大的前端控制器dispatcherServlet,对于请求和响应应进行统一处理。
- 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案。
- 代码清晰简洁,大幅度提升开发效率
- 内部组件化程度高,可拔插式组件即插即用,想要什么功能配置相应的组件即可。
- 性能卓越,尤其适合现代大型,超大型互联网项目要求。
1,3 初始案例
创建maven项目后,配置web.xml。注册springmvc的前端控制器DispatcherServlet
-
默认配置方式
此配置作用下springmvc的配置文件默认位于WEB-INF下,默认名称为-servlet.xml,例如,以下配置所对应的springmvc的配置文件位于WEB-INF下,文件名为springmvc-servlet.xml.
<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 --> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <!-- 设置springMVC的核心控制器所能处理的请求的请求路径 /所匹配的请求可以是/login或.html或.js或.css方式的请求路径 但是/不能匹配.jsp请求路径的请求 --> <url-pattern>/</url-pattern> </servlet-mapping>
-
建立controller层
@Controller
public class HelloController {
// 通过@RequestMapping注解,可以通过请求路径匹配要处理的具体的请求
// /表示的当前工程的上下文路径
@RequestMapping("/index")
public String index(){
return "index";
}
@RequestMapping("/target")
public String toTarget(){
return "target";
}
@RequestMapping("/test01")
public String test(){
return "test01";
}
}
- 建立页面
- 创建tomcat发布项目运行项目。
http://localhost:8008/springMVC/index
2,常用注解讲解
2.1,@RequestMapping注解
首先我们要知道这个注解的作用是将请求和处理请求的控制器方法关联起来,建立映射关系。
SpringMVC接收到指定的请求,就会来找到映射关系中对应的控制器方法来处理这个请求。
2.2,@RequestMapping注解的位置
@RequestMapping标识一个类,设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法,设置映射请求路径的具体信息。
@RequestMapping("/index")
public String index(){
return "index";
}
@RequestMapping注解的Value属性,@RequestMapping注解的value属性通过请求的请求地址匹配请求映射,value属性是一个字符串类型的数组,是可以存放多个字符串类型的,表示该请求映射能够匹配多个请求路径所对应的请求,就是说可以通过多个路径映射到一个地方,value属性是必须要进行设计的,至少通过请求地址匹配请求映射。(这里通过target和target1都可以访问到目标页面)
@RequestMapping("/target,“target1")
public String toTarget(){
return "target";
}
2.3,@RequestMapping注解的method属性
是指明请求方式(get或post方式)匹配请求映射,也是一个RequestMapping类型的数组,表示该请求映射能够匹配多种请求方式的请求。若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,这浏览器保存405错误
@RequestMapping(value = "/index" ,method = RequestMethod.GET)
public String index(){
return "index";
}
对于处理指定的请求方式,springmvc中也提供了@RequestMapping注解的派生注解,来进行处理特定的请求方式。
- 处理get请求有Getmapping方式
- 处理put请求有Putmapping方式
- 处理post请求有Postmapping方式
- 处理delete请求有Deletemapping方式
但是目前浏览器只支持get和post方式,如果在form表单中提交时,为method设置了其他的请求方式的字符串,则按照默认的请求方式get处理。若要发送put和delete请求,则需要通过spring提供的过滤器hiddenHttpMethodFilter
2.4,@RequestMapping注解的params属性
@RequestMapping注解的params属性通过请求的请求参数匹配请求映射,其中param属性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系。
“param”要求请求映射所匹配的请求必须携带param请求参数
“!param”要求请求映射所匹配的请求不能携带param请求参数
“param=value”要求请求参数所携带的请求必须满足参数值等于value值
“param!=value”要求请求所携带的参数不能等于value值
@RequestMapping(value = "/index" ,method = RequestMethod.GET
,params = {"name","password!=123456"})
public String index(){
return "index";
}
这里要求请求参数必须携带两个参数,且第二个参数中password不能等于123456
2.5,@RequestMapping注解的headers属性
@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射,是一个字符串类型的数组,可以通过四种表达式来设置请求头信息和请求映射的匹配关系。
和param上面的四种表达式一样。
若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面显示404错误,即资源未找到。
3,springmvc中的ant风格的路径
?表示匹配单个字符
*表示匹配任意的0个或一个字符
**表示任意的一次或多层目录
4,springmvc中支持路径中的占位符
原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
springmvc路径中的占位符常用与RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}来表示传输的数据,在通过@pathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。
@RequestMapping(value = "/index" ,method = RequestMethod.GET
,params = {"name","password!=123456"})
public String index(@PathVariable("id")String id,@PathVariable("name")String name){
return "index";
}
5,springmvc获取请求参数
- 将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。
@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){
String username=request.getParameter("username");
String password=request.getParameter("password");
}
若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器发放的形参中设置字符串数组或者字符串类型的形参来接收此请求参数。若使用字符串数组类型的形参,此参数的数组中包含了每一个数据。若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果。
- @RequestParam注解
@RequestParam注解是将请求参数和控制器方法的形参创建映射关系,一共有三个属性: -
- value:指定为形参赋值的请求参数的参数名,
-
- required:设置是否必须传输次请求参数,默认为true,若设置为true时,则当前请求必须传输value所指定请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400.所设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null。
-
- defaultValue:不管required属性值为true还是false,当value所指定的请求参数没有传输或传输的值为“”时,则使用默认值为形参赋值。
- @RequestHeader注解是将请求头信息和控制器方法的形参创建映射关系,一共有三个属性:value、required、defaultParam
- @CookieValue注解
- 通过POJO获取请求参数
可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性一致,那么请求参数就会为此属性赋值。
<form th:action="@{/testpojo}" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:<input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女<br>
年龄:<input type="text" name="age"><br>
邮箱:<input type="text" name="email"><br>
<input type="submit">
</form>
@RequestMapping("/testpojo")
public String testPOJO(User user){
System.out.println(user);
return "success";
}
//最终结果-->User{id=null, username='张三', password='123', age=23, sex='男', email='123@qq.com'}
6,域对象共享数据
6.1,通过servletAPI向request域对象中添加数据来共享数据域
- 首先创建域对象
@RequestMapping("/servletApi")
public String test(HttpServletRequest request){
request.setAttribute("testRequestScope","helloffy");
return "success";
}
- 然后在页面获取数据
<p th:text="${testRequestScope}"></p>
6.2,使用modelandview向request域对象共享数据
首先我们要知道modelandview是包含两个部分分别是model实体和view页面两个部分,是既包含数据又包含页面的对象。就是模型和视图。
为modelandview中设置参数和获取参数方法。
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("testRequestScope","hello");
// 处理模型数据,即向请求域request共享数据
modelAndView.setViewName("success");
return modelAndView;
}
视图层
<p th:text="${testRequestScope}"></p>
成功获取参数信息
这里也可以使用另外一种方法为页面赋值
public String testModelAndView1(Model model){
model.addAttribute("testRequestScope","hello");
return "success";
}