SpringMVC开发笔记
来源:互联网 发布:数据黑产吧 编辑:程序博客网 时间:2024/05/30 23:04
1. SpringMvc 局部刷新:
方法1 主要思路就是,返回的时候返回一个HTML代码片段,然后在$post的回调函数里对前端dom进行修改。
具体说来就是先新建一个jsp,如:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><c:forEach items="${blacklist}" var="blacklistitem" varStatus="status"><tr> <td align="left"><input type="checkbox" name="nCheckBoxId" value="${blacklistitem.blockId}" /></td> <td align="left">${blacklistitem.resource.resourceName}</td> <td align="left">${blacklistitem.resource.type}</td> <td align="left">${blacklistitem.resource.size}</td> <td align="left">${blacklistitem.blackdate}</td> <td align="left"> <c:if test="${blacklistitem.whitedate == null}">未解封</c:if> <c:if test="${blacklistitem.whitedate == \"\"}">未解封</c:if> <c:if test="${blacklistitem.whitedate != null}">${blacklistitem.whitedate}</c:if> </td> <td align="left">${blacklistitem.reason}</td> <td class="resourcestatus" align="left"> <c:if test="${blacklistitem.status == 1}"> 封禁中</c:if> <c:if test="${blacklistitem.status == 0}"> 已解除</c:if> <c:if test="${blacklistitem.status == -1}">已删除 </c:if> </td> </tr></c:forEach>
然后ModeAndView就返回这个jsp。
接下来在回调函数里:
function(data){ $('#mydata').html(data);}
方法2 返回json,然后使用这些数据进行局部刷新。
但这种方法不太适用于使用发量数据(比如表格),会让回调函数变得很麻烦,还不如返回编译好的html代码省事(即方法一)。
但好处在于不用新建页面。这两种方法各有利弊,实际使用看情况来用了。
2. SpringMvc 返回json:
方法1 主要思路和局部刷新的方法一差不多,只是局部刷新的时候返回的时候返回一个HTML代码片段,而这里在jsp里写的是json字符串:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> { "cpu": [${sysinfo.cpu.user},${sysinfo.cpu.nice},${sysinfo.cpu.system},${sysinfo.cpu.iowait},${sysinfo.cpu.steal},${sysinfo.cpu.idle}], "io": [${sysinfo.io.svctm},${sysinfo.io.rrqms},${sysinfo.io.wrqms},${sysinfo.io.rs},${sysinfo.io.util}, ${sysinfo.io.await},${sysinfo.io.ws},${sysinfo.io.wsecs},${sysinfo.io.avgrqsz},${sysinfo.io.avgqusz},${sysinfo.io.rsecs}] }
但是在这种情况下,返回的json实际上只是个字符串,在谷歌内核浏览器的调试工具能够看到Response Headers 的Content-Type的值为”text/html;charset=UTF-8”,因此需要在前端js中对传来的字符串进行解析。
这里有两种办法:
①
var json = eval('(' + str + ')'); //注意要字符串两边要有小括号,这里的作用应该是防止str含有的东西污染外边
②
var json = JSON.parse(str); //这里要注意,用这种方法需要严格遵守JSON规范,否则js绝对会报错。
方法2 使用MappingJacksonJsonView来通过ModelAndView为前端传json,这种方法不需要对串进行解析:
ModelAndView mav = new ModelAndView(); MappingJacksonJsonView view = new MappingJacksonJsonView(); Map attributes = new HashMap(); attributes.put("success", Boolean.TRUE); attributes.put("contractNo", "contractNo"); view.setAttributesMap(attributes); mav.setView(view); return mav;
注:折腾这些时发现个很有意思的事情:在controller中处理路由的函数一般都返回一个ModelAndView对象,但如果你写的是返回一个字符串”xxx”,则实际这个框架回去找xxx.jsp来返回;而如果你在返回的ModelAndView对象中不指定view的话,则会去找这个路由对应的jsp文件。比如你处理的路由为/test/upload,则它会去找/test/upload.jsp。不知道是和配置文件有关还是这是该框架的特性~
3. SpringMvc 拦截器的使用:
1.在dispatcher-servlet.xml配置拦截器:
<!-- 拦截器 --> <mvc:interceptors> <!-- 如果要对所有请求都拦截可直接把bean写到<mvc:interceptors>下而非<mvc:interceptor>下 --> <mvc:interceptor> <!-- 对所有的请求拦截使用/** ,对某个模块下的请求拦截使用:/myPath/* --> <mvc:mapping path="/**"/> <bean class="cn.bjtu.shixun2.interceptor.AccountInterceptor"> <!-- 对于要放松判定的路由,先写到这里,稍后再程序里判断 --> <property name="uncheckUrls"> <list> <value>/signup</value> <value>/login</value> <value>/share/</value> <value>/bower_components/</value> <value>/css/</value> <value>/dist/</value> <value>/images/</value> <value>/css/</value> <value>/js/</value> <value>/less/</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors>
2.编写AccountInterceptor类继承HandlerInterceptorAdapter :
public class AccountInterceptor extends HandlerInterceptorAdapter { private final Logger log = Logger.getLogger(AccountInterceptor.class); private List<String> uncheckUrls; public List<String> getUncheckUrls() { return uncheckUrls; } public void setUncheckUrls(List<String> uncheckUrls) { this.uncheckUrls = uncheckUrls; } public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if ("GET".equalsIgnoreCase(request.getMethod())) { //RequestUtil.saveRequest(); } log.info("==============执行顺序: 1、preHandle================"); String requestUri = request.getRequestURI(); String contextPath = request.getContextPath(); String url = requestUri.substring(contextPath.length()); log.info("requestUri:"+requestUri); log.info("contextPath:"+contextPath); log.info("url:"+url); //if(uncheckUrls.contains(url)) return true; for(String uncheckUrl:uncheckUrls){ if(url.indexOf(uncheckUrl)==0) return true; } //TODO 做拦截的事情 if(request.getSession().getAttribute("user")==null){ log.info("Interceptor:跳转到login页面!"); response.sendRedirect(contextPath+"/login"); return false; } else return true; } /** * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 * 可在modelAndView中加入数据,比如当前时间 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("==============执行顺序: 2、postHandle================"); } /** * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 * * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion() */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("==============执行顺序: 3、afterCompletion================"); } }
3. SpringMvc 获取web根目录:
1.在web.xml的节点内要有:
<context-param> <param-name>webAppRootKey</param-name> <param-value>web.root</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> </listener>
2.使用:
System.getProperty("web.root");
tips:java中可用System.getProperty()获取的值
4. SpringMvc 上传文件实现:
1.确保要有包:
commons-fileupload-x.x.jar
commons-io-x.x.jar
2.在配置文件里这么写:
<!-- fileUpload Support --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8"/> <!--max size: 10M--> <property name="maxUploadSize" value="10485760"/> </bean>
3.在controller里这么写:
@RequestMapping("info/upload/avatar") public ModelAndView uploadAvatar(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "uploadfile", required = false) MultipartFile file){ String fileName = file.getOriginalFilename(); String type = fileName.substring(fileName.lastIndexOf(".")); System.getProperty("web.root"); String filepath = System.getProperty("web.root") +"images"+System.getProperty("file.separator") +"useravatar"+System.getProperty("file.separator") +fileName+type; File targetFile = new File(filepath); try { file.transferTo(targetFile); } catch (Exception e) { e.printStackTrace(); } return null; }
4.在前端这么写:
<form method="post" action="${basePath}info/upload/avatar" enctype="multipart/form-data"> <input id="lefile" name="uploadfile" type="file" onchange="validateFile()" style="display:none"> <div> <button onclick="$('input[id=lefile]').click();">浏览</button> <button id="upload" type="submit" class="btn btn-primary" disabled>上传</button> </div> </form>
- SpringMVC开发笔记
- springmvc学习笔记(22)-springmvc开发小结
- springMVC框架开发笔记 lesson1 springMVC编程
- springmvc学习笔记(22)-springmvc开发小结
- springMVC框架开发笔记 lesson2 注解开发
- SpringMVC注解开发(基础)---SpringMVC学习笔记(七)
- SpringMVC学习笔记(二)——SpringMVC开发环境搭建
- SpringMVC注解开发(基础)---SpringMVC学习笔记(七)
- springMVC框架开发笔记 lesson4 SSM实例
- springMVC 笔记
- springMVC 笔记
- springmvc 笔记
- springMVC笔记
- springmvc笔记
- SpringMVC笔记
- SpringMVC笔记
- springmvc笔记
- 【springmvc笔记】
- Codeforces Round #352 (Div. 2) A.Summer Camp
- 安装win7、windows server 2012 出现无法配置在此计算机硬件上运行 解决方案
- 初学java反射机制
- 使用logstash+elasticsearch+kibana快速搭建日志平台
- 1.2.21 Map.values方法——获取Map集合中的所有键值对象
- SpringMVC开发笔记
- 2016/5/27 1004. 简单减法
- Qt之自定义布局管理器(QCardLayout)
- 通过命令的方式实现计算机定时关机
- sas:主成分分析
- 自制Camera例子——相机效果
- 问题:In IOS8 wakeups limit
- Solr -- 查询语法/参数
- js一键复制,Clipboard.js:不用Flash实现剪贴板功能的轻量级JavaScript库