springMVC讲解(上)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
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错误即资源未找到。
3springmvc中的ant风格的路径
表示匹配单个字符
*表示匹配任意的0个或一个字符
**表示任意的一次或多层目录
4springmvc中支持路径中的占位符
原始方式/deleteUserid=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";
}
5springmvc获取请求参数
- 将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";
}