SpringMVC 常用注解 及 其用法 (下)

来源:互联网 发布:淘宝买家金钻好处 编辑:程序博客网 时间:2024/04/30 09:04
-----处理json问题,前端接受、发送json数据,或者控制器接收、发送json数据


需要包jackson-jr-all-2.4.3.jar;jackson-annotations-2.6.0.jar;jackson-core-2.6.0.jar;jackson-databind-2.6.0.jar
spring4如下配置
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">      <property name="messageConverters">          <list>              <ref bean="mappingJackson2HttpMessageConverter" />          </list>      </property>  </bean>  <bean id="mappingJackson2HttpMessageConverter"           class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">      <property name="supportedMediaTypes">          <list>              <value>application/json;charset=UTF-8</value>              <value>text/html;charset=UTF-8</value>              <value>text/json;charset=UTF-8</value>              </list>      </property>   </bean> 

@ResponseBody 处理json时使用,用于将数据转换成json格式返回前端


@RequestBody 用于接受前端ajax发出的json数据


控制器内的方法通过map发送数据给前端,也可返回具体对象 等
eg.
@RequestMapping(value="/ajaxString.action")public @ResponseBody void loginUI(String name) throws Exception{System.out.println(name);//也可通过request.getParameter("name");接收}@RequestMapping(value="/ajaxObject.action")public @ResponseBody Map loginUI1(@RequestBody User user) throws Exception{System.out.println(user.getName());Map<String,Object> map = new HashMap<>();map.put("msg", "asd");map.put("user", user);return map;}//若是返回具体对象,则怎么写/*@RequestMapping(value="/ajaxObject.action")public @ResponseBody User loginUI1(@RequestBody User user) throws Exception{System.out.println(user.getName());user.setPassword("asdasdasdasda");return user;}*/

前端页面
<script type="text/javascript" src="/js/jquery-1.10.2.min.js"></script><script type="text/javascript">function doTest1(){$.ajax({url:"${basePath}/login/ajaxString.action",data:{"name":"阿斯顿"}, type:"post",async:true,success:function(msg){alert(msg.msg);//返回undefine,因为后台返回值卫void},});} function doTest2(){data={"name":"2323"};$.ajax({url:"${basePath}/login/ajaxObject.action",type:"post",dataType:"json",contentType: 'application/json',data:JSON.stringify(data),async:true,success:function(msg){alert(msg.msg);//返回后台设置的数据alert(msg.user.name);}}); }</script><a href="javascript:doTest2()" id="ajax" >ajax2</a>




----文件的上传下载上传,使用的是MultipartFile这个类来实现
1.导包commons-fileupload 和 commons.io
2.配置文件
<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="102400000"></property></bean>
3.前端 (注意enctype的值要写成multipart/form-data)
<form action="${basePath}/upload.action" method="post" enctype="multipart/form-data"><input type="file" name="file"><button type="submit">上传</button></form>
4.控制器
@RequestMapping(value="/upload.action")public String upload(HttpServletRequest request,@RequestParam("file") MultipartFile file) throws Exception{System.out.println(file.getName());//表单按钮的nameSystem.out.println(file.getOriginalFilename());//上传的文件的名字if(!file.isEmpty()){SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");//获取目录String path = request.getServletContext().getRealPath("/upload/");//为上传的文件命名String fileName = file.getOriginalFilename();String realFileName = sdf.format(new Date()) + fileName.substring(fileName.lastIndexOf("."));file.transferTo(new File(path + File.separator + realFileName));//将上传的文件保存到一个目录中}return "/success.jsp";}

限制文件上传大小可以在配置文件设置
限制文件类型只能在控制器中获取文件名的后缀去判断


文件下载
1.前端页面
<a href="${basePath}/download.action?filename=QQ截图20170716131950.jpg">下载</a>
2.控制器
@RequestMapping(value="/download.action")public ResponseEntity<byte[]> download(HttpServletRequest request,@RequestParam("filename") String filename) throws Exception{//获取下载路径String filePath = request.getServletContext().getRealPath("/upload/");File file = new File(filePath + File.separator + filename);//http头HttpHeaders headers = new HttpHeaders(); //下载显示的文件名,不然下载时浏览器识别不了中文       String downloadFielName = new String(filename.getBytes("UTF-8"),"ISO8859-1");//设置相应报头,通知浏览器以attachment(下载方式)打开图片        headers.setContentDispositionFormData("attachment", downloadFielName);         //application/octet-stream : 二进制流数据(最常见的文件下载)。        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);}


-----路径跳转 、数据共享问题
springmvc 中
在返回值String方法的 return里写,return "forward:另一个action的路径"属于请求转发
return "redirect:另一个action的路径" 属于url重定向,重定向无法共享request域参数,但是return "redirect:另一个action的路径?参数名=参数值",这样也可以共享,或者放在session中


在控制器类 方法里的参数列表中,可以通过声明 HttpServletRequest request, HttpServletResopnse response, HttpServletSession session 来调用 这些 传统api中的方法处理


-----

处理编码问题
处理编码问题需要在web.xml里设置编码过滤器只解决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>

注意要写在前面,不然可能会出现先经过spring处理而导致编码设置失效



-----其他的
加载静态资源,如图片,css,js之类的
<mvc:resources location="" mapping="" />
mapping:映射
location:本地资源路径,注意必须是webapp根目录下的路径。
两个*,它表示映射resources/下所有的URL,包括子路径(即接多个/)


当有spring和springmvc注解时,为了不发生注解读取失效,需要加入下面这句,表示不读取下面的注解,放给其他文件读取
比如在spring配置文件中加入下面语句,表示不读取springmvc的注解,让springmvc配置文件去读取(即在springmvc配置文件中需要配置注解扫描)
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>