一、spring拦截器
网上找到拦截器分为传统的和基于注解的两种,此处使用了基于注解的方式(简单易懂又看上去高大上→_→)
xml里的配置:
当初的要求是要写一个验证登录的拦截器,假如用户未登录而直接进入管理页面,则会跳转到登录页面。
/ma为项目的自定义根目录,通常不被拦截器验证的部分写在/op下(主管说的-0-),现在的方法每添加一条路径就要添加一个
解决:
配置xsi:schemaLocation=”http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd”,3.0不支持exclude-mapping
登录检查拦截器类
package org.wpapp.webapp.ma.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import org.wpapp.webapp.ma.base.Constants; public class AdminInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.setContentType("text/html; charset=utf-8"); HttpSession session = request.getSession(); System.out.println(session.getId()); String key = (String) session.getAttribute(session.getId()); if(key!=null && key.equals(Constants.admin_key)) ; else { response.sendRedirect(request.getContextPath()+"/ma/op/index"); } return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub } }
二、加载静态资源
刚写完后台,导入jsp的时候出现了css,js和图片无法载入的情况,一开始以为路径错了,F12看了半天,没见错哪里,后来才发现spring mvc默认不加载静态资源(真是坑死新手- -)
简单点的方法:
该方法会加载所有静态资源,假如只想加载部分资源,则:
将本地的资源文件夹映射到对应的URL地址或是写在web.xml中,例如:
default*.jpgdefault*.jsdefault*.css
三、Controller
(1)Controller返回jsp页面的方法有两种:
a、利用ModelAndView
该方法适用于要传递动态数据的时候
@RequestMapping("/list")//方法对应的URL地址 public ModelAndView list(){ //jsp文件本地路径 ModelAndView mv = new ModelAndView("interface/management_interface"); //添加参数(其实就是setAttribute) mv.addObject("index", 5); return mv; }
注意到没,这是个相对地址,而且没有.jsp,原因在这:
b、直接返回页面
@RequestMapping("/showApiAuth") public String showApiAuth() { return "interface/apiAuth"; }
(2)和ajax交互的方法需要加上@ResponseBody,返回值为object,list套map的写法可以直接用json接收数据
@RequestMapping("/update") @ResponseBody public Object update(int apiId,int state){ AppApiDetail apiDetail = interfaceService.load(apiId); apiDetail.setApiState(state); interfaceService.update(apiDetail); return showList(); } public ListshowList(){ ListapiList = null; Listlist = new ArrayList(); apiList = interfaceService.loadAll(); Iteratoriterator = apiList.iterator(); while(iterator.hasNext()){ AppApiDetail api = iterator.next(); Mapmap = new HashMap(); map.put("api", api); list.add(map); } return list; }
四、ajax处理form请求
要上传文件一般是在form后加上enctype=”multipart/form-data”属性,使用”file”上传。
要获取form提交后的返回值一般用ajax,将form序列化。
但当要同时做这两件事的时候问题就来了,传统的ajax方式不支持文件上传,后台获取的文件或变成null。
解决方法是使用jquery.form.js,此js需要jquery的支持
function doUpLoad() { function callback(data) { $(".top_yygl img:eq(0)").attr("src", "ma/t/fileopen♪att_id="+data[0].big); $(".top_yygl img:eq(1)").attr("src", "ma/t/fileopen♪att_id="+data[0].mid); $(".top_yygl img:eq(2)").attr("src", "ma/t/fileopen♪att_id="+data[0].small); $("#big_attr_id").val(data[0].big); $("#mid_attr_id").val(data[0].mid); $("#small_attr_id").val(data[0].small); } var options = { url: "ma/application/uploadImg/", success : callback, type : 'post', dataType : 'json', clearForm : true }; $("#uploadForm").ajaxSubmit(options); }
五、atrDialog
一个美观的弹出框插件,简化了部分代码
确认删除功能:
function del(appId) { art.dialog.confirm("确定要删除吗?", function() { location = "javascript:update(" + appId + ",2)"; }); }
载入一个页面:
function showAddApp(id) { dialogApp = art.dialog.load('ma/application/showAddApp', { lock : true, top : '10%', padding : 0 }); }
artDialog详细介绍请看:这里