【java框架】SpringMVC(3)--SpringMVC控制器常用…
2020-03-15 16:02:02来源:博客园 阅读 ()
【java框架】SpringMVC(3)--SpringMVC控制器常用业务操作
1. SpringMVC控制器业务操作
在SpringMVC第二节中我们了解到mvc控制器处理页面url请求返回响应视图,除了这些操作外,控制器还需要处理更重要的业务,如:接收前台页面传递的参数、绑定数据到页面、返回json数据、文件上传、文件下载等业务操作。
1.1.参数接收
1.1.1. 配置请求编码过滤器
SpringMVC框架本身没有处理请求编码,在前台参数接收Post请求的时候,可能会出现编码乱码的问题,而Spring框架为我们提供了一个请求编码过滤器,我们只需要在web.xml中配置一个请求编码过滤器即可:
web.xml中配置UTF-8编码如下:
<?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_4_0.xsd" version="4.0"> <!--配置post请求编码乱码处理过滤器--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
1.1.2. 参数接收方式
GET接收方式:
① 使用方法的形参接收:注意形参要和请求参数一致;
@Controller @RequestMapping(value = "/paramController", method = RequestMethod.GET) public class ParamRecCotroller { /** * 参数接收方式一:使用形参接收,前台get请求传入的参数名和方法接收的参数名保持一致 * @param username * @param age */ @RequestMapping("/insert") public void insert(String username, Integer age){ System.out.println(username); System.out.println(age); } }
前台get参数传递方式:
http://localhost:8080/paramController/insert?username=”青海”&age=21
获取到的参数信息:
② 如果形参名称和前台传入的参数名不一致,需要使用@RequestParam(value=”前台参数名”)进行映射对应;
@Controller @RequestMapping(value = "/paramController", method = RequestMethod.GET) public class ParamRecCotroller { /** * 参数接收方式二:前台get传递的参数url与方法形参某个参数不一致,需要使用@@RequestParam(value = "前台参数名") * @param username * @param age */ @RequestMapping("/insert") public void insert(@RequestParam(value = "name") String username, Integer age){ System.out.println(username); System.out.println(age); } }
前台get参数传递方式:
http://localhost:8080/paramController/insert?name=”青海”&age=21
获取到的参数信息:
③ 直接使用一个Domain对象接收前台参数,会根据Domain中的属性来进行匹配装值;
@Controller @RequestMapping(value = "/paramController", method = RequestMethod.GET) public class ParamRecCotroller { /** * 参数接收方式三:直接使用一个Domain对象来接收前台参数,每个前台参数必须和User里面的属性名保持一致(前台参数直接映射属性), * 不然无法获取对应的参数值,而且必须保证User内有一个无参数的构造器 * @param user */ @RequestMapping("/insert") public void insert(User user){ System.out.println(user); } }
对应Domain中的User类:
public class User { private String username; private Integer age; private String password; public User() { } public User(String username, Integer age, String password) { this.username = username; this.age = age; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", age=" + age + ", password='" + password + '\'' + '}'; } }
前台get参数传递方式:
http://localhost:8080/paramController/insert?username=”青海”&age=21&password= 3454
获取到的参数信息:
④ 使用原始的HttpServletRequest来获取请求参数信息;
@Controller @RequestMapping(value = "/paramController", method = RequestMethod.GET) public class ParamRecCotroller { /** * 参数接收方式四:直接使用HttpServletRequest获取 * @param request */ @RequestMapping("/insert") public void insert(HttpServletRequest request){ String username = request.getParameter("username"); Integer age = Integer.valueOf(request.getParameter("age")); String pwd = request.getParameter("pwd"); System.out.println(username); System.out.println(age); System.out.println(pwd); } }
前台get参数传递方式:
http://localhost:8080/paramController/insert?username=”青海”&age=21&pwd= 3454
获取到的参数信息:
⑤ Restful风格请求参数传递:直接在映射地址上使用{id}占位符,id表示传递的参数名,方法接收时对方法的形参使用@PathVariable(“id”),这里面的id应该和映射地址上的id名称保持一致;
@Controller @RequestMapping(value = "/paramController", method = RequestMethod.GET) public class ParamRecCotroller { /** * 参数接收方式四:前台请求地址中包含id参数信息,使用restful风格映射对应相同的提取参数 * 注意:前台参数名称必须与restful风格的参数一一对应,名称一致 * @param idVal */ @RequestMapping("/insert/{id}") public void getUserById(@PathVariable(value = "id") Integer idVal){ System.out.println(idVal); } }
前台get参数传递方式:
http://localhost:8080/paramController/insert/5
获取到的参数信息:
1.2.数据传递
简单地说,就是使用SpringMVC中Controller向前台页面传递数据。使用Controller进行数据传递的方式主要有四种传递方式:
① 通过ModelAndView对象传递
@Controller @RequestMapping("/dataController") public class DataTransController { /** * 页面展示返回数据方式一:通过ModelAndView对象传递 * setViewName:返回一个结果视图 * addObject(name, value):可以通过name到对应的显示页面上去取数据,value表示显示的数据, * 也可以传递对象来取值 * @return */ @RequestMapping("/getData") public ModelAndView getDataRes(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg", "随便写一个msg信息"); modelAndView.setViewName("/WEB-INF/views/dataView.jsp"); User user = new User("青海", 21, "2332"); modelAndView.addObject("user", user); return modelAndView; } }
对应jsp页面取值:
<body> ${msg}<br/> ${user}<br/> ${user.username}<br/> ${user.age}<br/> ${user.password}<br/> </body>
对应页面展示数据信息如下:
② 通过Model对象进行数据传递;
@Controller @RequestMapping("/dataController") public class DataTransController { /** * 页面展示返回数据方式二:通过Model对象传递 * return:返回一个结果视图 * addObject(name, value):可以通过name到对应的显示页面上去取数据,value表示显示的数据, * 也可以传递对象来取值 * @return */ @RequestMapping("/getModel") public String getModelRes(Model model){ model.addAttribute("msg", "Model对象的信息"); User user = new User("青海", 21, "2332"); model.addAttribute("user", user); return "/WEB-INF/views/modelDataView.jsp"; } }
对应jsp页面取值:
${msg}<br/> ${user}<br/> ${user.username}<br/> ${user.age}<br/> ${user.password}<br/>
对应页面展示数据信息如下:
③ 通过HttpServletRequest对象进行数据传递;
这种方式与Model对象传递方式类似,就是把参数换成HttpServletRequest对象,调用request.setAttribute(“msg”, 传递信息或者对象信息),这里就不再详细说明;
1.3.SpringMVC返回JSON数据
1.3.1. 实现方式
SpringMVC返回JSON数据格式需要导入Jackson的jar包,Jackson是解析JSON和XML的一个框架,简单易用,性能较高。
在项目中我们需要导入Jackson json的工具包,如下:
jackson-annotations-2.5.0.jar
jackson-core-2.5.0.jar
jackson-databind-2.5.0.jar
对应Controller实现方式:
@Controller @RequestMapping("/jsonController") public class JsonDemoController { @RequestMapping("/getJson") //加上@ResponseBody注解,返回值是通过JSON流的方式输出,Springmvc获取返回值,把对象自动转换为JSON //然后通过response.getWriter().print(jsonString)输出在前台页面 @ResponseBody public User getJsonUserData(){ User user = new User("青海", 21, "2332"); return user; } }
前台页面进行数据访问,访问地址:http://localhost:8080/jsonController/getJson
同样可以返回一个JSON集合,对应实现如下:
@Controller @RequestMapping("/jsonController") public class JsonDemoController { @RequestMapping("/getJsonList") @ResponseBody public List<User> getJsonUserLstData(){ User user1 = new User("青海", 21, "2332"); User user2 = new User("俊杰", 23, "3306"); List<User> userList = new ArrayList<>(); userList.add(user1); userList.add(user2); return userList; } }
前台页面进行数据访问,访问地址:http://localhost:8080/jsonController/getJsonList
1.3.2 日期型数据格式化
在处理日期Date类型的数据,如果后台不进行处理,那么默认返回的是时间戳的json日期格式:比如"birthday":1584261823034,此时需要在Domain的日期get属性方法上加上@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
/** * 如果不加JsonFormat,默认返回的日期格式是时间戳:比如"birthday":1584261823034 * 需要在日期属性Date的getXXX()方法上加上自定义的日期格式@JsonFormat注解 * @return */ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") public Date getBirthday() { return birthday; }
同理,在前台向后台传入字符串类型的Date数据时,需要在Domain的日期set属性方法上加上@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss"),后台才能接收到对应的Date参数并转换为日期数据到后台
/** * 前台Get方式brithday以字符形式传递,需要加上@DateTimeFormat注解, * 才能向后台传递Date类型数据 * @param birthday */ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") public void setBirthday(Date birthday) { this.birthday = birthday; }
1.4.SpringMVC文件上传
SpringMvc自己没有实现文件上传,需要使用apache.commons.fileupload,需要导入文件上传相关的包:
com.springsource.org.apache.commons.fileupload-1.2.0.jar
com.springsource.org.apache.commons.io-1.4.0.jar
创建FileUploadController:
@Controller @RequestMapping public class FileUploadController { //通过get请求,返回一个文件上传的jsp页面--结果视图 @RequestMapping(value = "/upload", method = RequestMethod.GET) public String uploadFileGet(){ return "/WEB-INF/views/upload.jsp"; } //文件上传的实现方法 @RequestMapping(value = "/upload", method = RequestMethod.POST) public String uploadFilePost(String name, MultipartFile imge, HttpServletRequest request) throws IOException { //获取上传文件的原始文件名 String oriFilename = imge.getOriginalFilename(); //获取文件名的后缀 String suffix = FilenameUtils.getExtension(oriFilename); //产生一个随机的文件名 String uuidName = UUID.randomUUID().toString(); String fileName = uuidName + "." +suffix; //获取文件的保存路径 String fileDir = request.getServletContext().getRealPath("/upload"); //使用File流来写入文件 File file = new File(fileDir, fileName); //文件夹不存在,就创建一个保存路径 if(!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } //IO流的拷贝 IOUtils.copy(imge.getInputStream(), new FileOutputStream(file)); return "/WEB-INF/views/upload.jsp"; } }
准备jsp上传页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>文件上传页面</title> </head> <body> <!—文件上传:必须写:enctype="multipart/form-data"—> <form action="/upload" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="name"/><br/> 头像:<input type="file" name="imge"/><br/> <input type="submit" value="提交"/> </form> </body> </html>
在applicationContext-mvc.xml中配置multipartResolver:
<!--配置文件上传解析器:id="multipartResolver",这个id不能乱写,还可以 设置一个maxUploadSize属性,就是上传文件的大小--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>2000000000</value> </property> </bean>
1.5. ViewResolver视图解析器
前面我们在Controller中返回ModelAndView结果视图时,如果是多个方法,需要一一返回结果视图,结果视图重复的内容还是需要写一遍,比较麻烦:
使用ViewResolver视图解析器配置返回的结果视图.jsp,可以设置视图路径的前后缀,该配置可以让我们写视图路径的时间更加简单。
具体需要在applicationContext-mvc.xml中配置如下内容:
<!--配置默认的视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean>
之后在Controller中即可简化视图访问的写法:
@Controller @RequestMapping("/resolver") public class ResolverController { @RequestMapping("/demo1") public ModelAndView demo1(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("resolver_demo1"); return modelAndView; } @RequestMapping("/demo2") public ModelAndView demo2(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("resolver_demo2"); return modelAndView; } }
对应前台的页面访问:
原文链接:https://www.cnblogs.com/yif0118/p/12500419.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Java中的IO与NIO
下一篇:java 静态代码块
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash