Java知识点总结:想看的可以从这里进入
现实中接受参数的情况是很复杂的,比方说使用RestFul风格,是把参数写入到请求路径中,有些传递的是Json数据,还有传递什么分页参数等等各种情况。
所以学习SpringMVC首先就要学习处理各式各样的参数。
Spring MVC还是比较智能的,我们也了解过SpringMVC有内置的组件来验证数据,所以对于普通的数据来说,它可以自动自动映射获取相关数据,当然SpringMVC也有多种方法可以获取这些参数。
首先我们创建一个表单用来默认提交数据:
通过 HttpServletRequest 获取请求参数
@RequestMapping("submit")
@ResponseBody
public String submit(HttpServletRequest request){
String name = request.getParameter("name");
String address = request.getParameter("address");
System.out.println("姓名:"+name);
System.out.println("地址:"+address);
return "获取到的数据:姓名是"+name+",地址是"+address;
}
通过控制器方法的形参获取请求参数(参数名必须和提交的name值一样,无视参数的数据类型的String可以接收任何参数,不适用于请求参数过多的请求)(若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参 [用,拼接起来] 接收此请求参数)
@RequestMapping("submit")
@ResponseBody
public String submit(String name,String address){
return "获取到的数据:姓名是"+name+",地址是"+address;
}
使用 @RequestParam(“name的值”) 注解获取请求参数:和第二种类似,但可以解决参数名和name值不一致的问题,有三个参数
value:指定为形参赋值的请求参数的参数名、
required:设置是否必须传输此请求参数,默认值为true
若设置为true,则当前请求必须传输value所指定的请求参数。若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null
defaultValue:默认值,不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为 “” 时,则使用默认值为形参赋值
@RequestMapping("submit")
@ResponseBody
public String submit(@RequestParam("name")String username, @RequestParam("address")String site){
//@RequestParam("name")会解决前端的name和接受参数username不一致的问题
return "获取到的数据:姓名是"+username+",地址是"+site;
}
通过实体类对象获取请求参数:前提是前端提交过来的数据其name值和相应的实体属性能够匹配上
public class User {
private String name;
private String address;
private String age;
private String information;
.........get和set方法.......
}
@RequestMapping("submit")
@ResponseBody
public String submit(User user){
return "获取到的数据:姓名是"+user.getName()+",地址是"+user.getAddress();
}
普通的参数直接通过映射即可获取到,但是如果使用RestFul风格,以URL的形式传递参数,比方说之前的路径为:http://localhost:8080/summation?num1=15&num2=3,那么RestFul风格就会变成:http://localhost:8080/summation/15/3。
想要获取这种类型的参数,除了@RequestMapping外 还需要借助一个注解:@PathVariable(“”)。
@RequestMapping注解的value属性中通过占位符 {xxx}
表示传输的数据,再通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。
比如:我传递这样一个参数:http://localhost:8080/springmvcjsp/disposeParams/submit/羽/中国
@RequestMapping("submit/{name}/{address}")
@ResponseBody
public String submit(@PathVariable("name")String name,@PathVariable("address")String address){
return "获取到的数据:姓名是"+name+",地址是"+address;
}
@RequestMapping中使用{} URL中的参数部分,而@PathVariable(“”) 负责将其映射到参数中
JSON(JavaScript Object Notation)在前后端分离的情况下会被大量的使用,它是用纯文本格式来表示数据的,这使得它被大量使用,成为一种理想的数据交换语言。
JSON是JavaScript对象的字符串表示方法,它是将对象用一定的格式解析成一个字符串来保存数据的。
使用JavaScript模拟一些传递的数据为JSON,是User对象的集合:
<script>
$(function(){
$("#testsub").bind('click', function (event) {
var json = [
{name: "羽", address:"中国", Age: 22, information: "无"},
{name: "张三", address:"英国", Age: 22, information: "无"},
{name: "李四", address:"美国", Age: 22, information: "无"},
{name: "王五", address:"外星人", Age: 22, information: "无"},
]
$.post({
url:"${pageContext.request.contextPath}/disposeParams/JSON",
data:JSON.stringify(json),
contentType:"application/json",
success:function (result){
alert(result);
}
});
});
})
</script>
然后使用controller接受JSON数据
@RequestMapping("JSON")
@ResponseBody
public void Json(@RequestBody List<User> userList){
userList.forEach(user ->{
System.out.println("获取到的数据:姓名是"+user.getName()+",地址是"+user.getAddress());
});
}
控制器在接收到 DispatcherServlet 分发过来的请求后,会调用 Model 层对请求进行处理,Controller 在接收到 Model 层返回的模型数据后,就会将模型数据通过域对象共享的方式传递给 View 视图进行渲染,最终返回给客户端展示。
在 Spring MVC 中,常用的域对象有 request 域对象、session 域对象、application 域对象等。可以通过以下方式共享数据:
request 域对象共享数据
使用 HttpServletRequest 对象共享数据
@RequestMapping("")
public String testHttpServletRequest(HttpServletRequest request) {
//共享数据
request.setAttribute("test", "test");
//实现页面跳转
return "路径";
}
使用 ModelAndView 向 request 域对象中共享数据
@RequestMapping("")
public ModelAndView testModelAndView(ModelAndView modelAndView){
//ModelAndView = Model(向请求域共享数据) + View(设置视图,实现页面跳转)
//共享数据
modelAndView.addObject("user","共享数据");
//设置视图,实现页面跳转
modelAndView.setViewName("视图路径");
return modelAndView;
}
使用 Model 向 request 域对象中共享数据
设置视图,实现页面跳转@RequestMapping("")
public String testModel(Model model) {
//共享数据
model.addAttribute("test", "test");
//实现页面跳转
return "视图路径";
}
使用 Map 向 request 域对象中共享数据
@RequestMapping("")
public String testMap(Map<String, Object> map) {
//共享数据
map.put("test", "test");
//实现页面跳转
return "视图路径";
}
使用 ModelMap 向 request 域对象中共享数据
@RequestMapping("/")
public String testModelMap(ModelMap modelMap) {
//共享数据
modelMap.addAttribute("test", "test");
//实现页面跳转
return "视图路径";
}
向 session 域中共享数据
@RequestMapping("")
public String testSession(HttpSession session) {
//共享数据
session.setAttribute("test", "test");
//实现页面跳转
return "视图路径";
}
向 application 域中共享数据
@RequestMapping("/testApplication")
public String testApplication(HttpSession session) {
//获取ServletContext
ServletContext application = session.getServletContext();
//共享数据
application.setAttribute("test", "test");
//实现页面跳转
return "视图路径";
}
Spring MVC 中也存在转发和重定向的概念,它是在逻辑视图名中通过“forward:”
和“redirect:”
两个关键字来表示转发和重定向。
在SpringMVC中有不同的的转发方式,其中的关键字 forward,可以省略也可以不省略。
通过方法返回字符串实现转发:这种方式在转发时Spring MVC 会将字符串中:“forward:” 部分识别为转发指示符,后面的部分被当做转发的 URL。
@RequestMapping("")
public String testForward() {
//forward:可省略
return "forward:/login";
}
通过 ModelAndView 实现转发
@RequestMapping("")
public ModelAndView testForward() {
ModelAndView mv = new ModelAndView();
//设置逻辑视图名 forward:可省略
modelAndView.setViewName("forward:/login");
return mv;
}
重定向也有两种实现方式,通过关键字 redirect,这个是不可以省略的
通过方法返回的字符串实现重定向
@RequestMapping("")
public String testRedirect() {
return "redirect:/login";
}
通过 ModelAndView 实现重定向:
@RequestMapping("/testRedirect2")
public ModelAndView testRedirect() {
ModelAndView mv = new ModelAndView();
//设置逻辑视图名
modelAndView.setViewName("redirect:/user");
return mv;
}