首页 > 代码库 > 阶段总结(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