首页 > 代码库 > 阶段总结(2014-07-23)
阶段总结(2014-07-23)
一、spring拦截器
网上找到拦截器分为传统的和基于注解的两种,此处使用了基于注解的方式(简单易懂又看上去高大上→_→)
xml里的配置:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/ma/*" /> <mvc:mapping path="/ma/interface/**" /> <mvc:mapping path="/ma/application/**" /> <mvc:mapping path="/ma/user/**" /> <mvc:mapping path="/ma/org/**" /> <mvc:mapping path="/ma/orgRole/**" /> <mvc:mapping path="/ma/appRoleManage/**" /> <bean class="org.wpapp.webapp.ma.interceptor.AdminInterceptor" /> </mvc:interceptor> </mvc:interceptors>
当初的要求是要写一个验证登录的拦截器,假如用户未登录而直接进入管理页面,则会跳转到登录页面。
/ma为项目的自定义根目录,通常不被拦截器验证的部分写在/op下(主管说的-0-),现在的方法每添加一条路径就要添加一个<mvc: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默认不加载静态资源(真是坑死新手- -)
简单点的方法:
<!-- 注册静态资源 --> <mvc:default-servlet-handler/>
该方法会加载所有静态资源,假如只想加载部分资源,则:
<mvc:resources mapping="/images/**" location="/images/" />
将本地的资源文件夹映射到对应的URL地址
或是写在ewb.xml中,例如:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern></servlet-mapping><servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern></servlet-mapping><servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern></servlet-mapping>
三、Controller
(1)Controller返回jsp页面的方法有两种:
a、利用ModelAndView
该方法适用于要传递动态数据的时候
@RequestMapping("/list")//方法对应的URL地址 public ModelAndView list(){ //jsp文件本地路径 ModelAndView mv = new ModelAndView("interface/management_interface"); //添加参数 mv.addObject("index", 5); return mv; }
注意到没,这是个相对地址,而且没有.jsp,原因在这:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp"></property></bean>
b、直接返回页面
@RequestMapping("/showApiAuth") public String showApiAuth() { return "interface/apiAuth";}
(2)和ajax交互的方法需要加上@ResponseBody,返回值为object,list套map的写法可以直接用json接收数据
@RequestMapping("/update")@ResponseBodypublic Object update(int apiId,int state){ AppApiDetail apiDetail = interfaceService.load(apiId); apiDetail.setApiState(state); interfaceService.update(apiDetail); return showList();}public List<Object> showList(){ List<AppApiDetail> apiList = null; List<Object> list = new ArrayList<Object>(); apiList = interfaceService.loadAll(); Iterator<AppApiDetail> iterator = apiList.iterator(); while(iterator.hasNext()){ AppApiDetail api = iterator.next(); Map<String, Object> map = new HashMap<String, Object>(); 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 });}
配置参数:
http://www.planeart.cn/demo/artDialog/_doc/API.html#options