spring MVC的一些小技巧

简介: <div class="markdown_views"><p>spring MVC的一些小技巧</p><h2 id="1在controller中获取指定name的bean"><strong>1,在controller中获取指定name的bean</strong></h2><pre class="prettyprint"><code class=" hljs jav

spring MVC的一些小技巧

1,在controller中获取指定name的bean

/***
     * 
     * @param request
     * @param beanName : 例如 userDao ,adminDao
     * @return
     */
    public Object getBean(HttpServletRequest request,String beanName){
        WebApplicationContext webApp=RequestContextUtils.getWebApplicationContext(request, request.getSession().getServletContext());
        return webApp.getBean(beanName);
    }

2,在controller中根据实体类自动注入dao

/***
     * 从WebApplicationContext 获取dao
     * @param request
     * @return
     */
    private  GenericDao<T> getDaoByWebApp(HttpServletRequest request){
        if(ValueWidget.isNullOrEmpty(dao)){
            WebApplicationContext webApp=RequestContextUtils.getWebApplicationContext(request   , request.getSession().getServletContext());
            try {
                dao=(GenericDao<T>)webApp.getBean(ValueWidget.title(SystemHWUtil.getFileSuffixName(clz.getName()+"Dao")));//返回的是同一个对象
            } catch (NoSuchBeanDefinitionException e) {
//              e.printStackTrace();
                dao=(GenericDao<T>)webApp.getBean(SystemHWUtil.getFileSuffixName(clz.getName()+"Dao"));//返回的是同一个对象
            }
            System.out.println("dao:"+dao);
        }
        return dao;
    }

那么clz 是如何获取的呢?

protected final Class<T> clz = SystemHWUtil.getGenricClassType(getClass());
/***
     * 获取实际的子类的class
     * 
     * @param clz
     * @return
     */
    public static <T> Class<T> getGenricClassType(
            @SuppressWarnings("rawtypes") Class clz) {
        Type type = clz.getGenericSuperclass();
        if (type instanceof ParameterizedType) {
            ParameterizedType pt = (ParameterizedType) type;
            Type[] types = pt.getActualTypeArguments();
            if (types.length > 0 && types[0] instanceof Class) {
                // System.out.println("class:"+types[0]);
                return (Class) types[0];
            }
        }

        return (Class) Object.class;
    }

3,在controller的action中指定response 的content type

使用produces

/***
     * 登录
     * @param model
     * @param status
     * @param view
     * @param session
     * @param request
     * @param callback
     * @return
     * @throws IOException
     */
    @ResponseBody
    @RequestMapping(value = "/login", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
    public String login(Model model, Integer status, UserView view,Integer issavePasswd,
            HttpSession session, HttpServletRequest request,HttpServletResponse response, String callback)
            throws IOException {
        init(request);
        String content = null;
        UserDao userDao = (UserDao) getDao();
        User user2 = null;
        Map map = new HashMap();
        int login_result = 0;
        AccessLog accessLog=logInto(request);
        accessLog.setDescription("会员登录");

        if (ValueWidget.isNullOrEmpty(view.getUsername())) {
            login_result = Constant2.LOGIN_RESULT_USERNAME_EMPTY;//用户名不能为空
            accessLog.setOperateResult("用户名不能为空");
        } else if (ValueWidget.isNullOrEmpty(view.getPassword())) {
            login_result = Constant2.LOGIN_RESULT_PASSWORD_EMPTY;//密码不能为空
            accessLog.setOperateResult("密码不能为空");
        } else if (ValueWidget.isNullOrEmpty(user2 = userDao.getByUsername(view
                .getUsername()))) {
            login_result = Constant2.LOGIN_RESULT_USERNAME_INVALID;//用户名不存在
            accessLog.setOperateResult("用户名不存在");
        } else if (!user2.getPassword().equals(view.getPassword())) {
            login_result = Constant2.LOGIN_RESULT_FAILED;//登录失败(用户名和密码不匹配)
            accessLog.setOperateResult("登录失败(用户名和密码不匹配)");
        } else {
            login_result = Constant2.LOGIN_RESULT_SUCCESS;
            session.setAttribute(Constant2.SESSION_KEY_LOGINED_USER, user2);
            map.put("session", session.getId());// 下载session id到客户端
            map.put("userId", user2.getId());// 下载session id到客户端
            System.out.println("session id:" + session.getId());
            Map mapCookie=new HashMap();
            if(issavePasswd/*包装类型*/!=null&&issavePasswd==1) {//记住密码
                mapCookie.put(Constant2.COOKIE_KEY_USERNAME, user2.getUsername());
                mapCookie.put(Constant2.COOKIE_KEY_PASSWORD, user2.getPassword());
            }else{
                mapCookie.put(Constant2.COOKIE_KEY_USERNAME, false);
                mapCookie.put(Constant2.COOKIE_KEY_PASSWORD, false);
            }
            WebServletUtil.rememberMe(request,response,mapCookie);
            accessLog.setOperateResult("登录成功,session id:"+session.getId());
        }
        // boolean isExist = userDao.isExist(view.getUsername(),
        // view.getPassword());

        map.put(Constant2.LOGIN_RESULT_KEY, login_result);
        logSave(accessLog, request);
        content = JSONPUtil.getJsonP(map, callback);
        return content;
    }

4,使用eclipse开发Java web项目时获取指定目录的真实绝对路径

String realpath =WebServletUtil.getUploadPath(request, "upload/download/apk", request
                .getSession().getServletContext(), Constant2.SRC_MAIN_WEBAPP);
                /***
     * 
     * @param request
     * @param uploadFolderName
     * @return
     */
    public static final String getUploadPath(HttpServletRequest request,
            String uploadFolderName, ServletContext sContext, String webappPath/*src\main\webapp
                                                                            */) {
        // project name:"/demo_channel_terminal"
        String projectName = request.getContextPath();// value:/shop_goods or
                                                        // "/springMVC_upload"
        String uploadPath = WebServletUtil.getUploadedPath(
                uploadFolderName/* "upload\" */, projectName, sContext,
                webappPath/* "src\main\webapp\" */);
        return uploadPath;
    }
/***
     * java web //
     * D:\xxx\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server
     * .core\tmp0\wtpwebapps\shop_goods\images //
     * D:\xxx\eclipse\workspace\shop_goods\ upload
     * 
     * @param uploadFolderName
     * @param projectName
     * @param sContext
     * @return
     */
    public static String getUploadedPath(String uploadFolderName,
            String projectName, ServletContext sContext,String webappPath/*src\main\webapp*/ ) {
        String uploadFolder_tmp = null;
        if (uploadFolderName.startsWith(File.separator)) {
            uploadFolder_tmp = uploadFolderName;
        } else {
            uploadFolder_tmp = File.separator + uploadFolderName;// "/upload"
        }
        String realpath = sContext.getRealPath(uploadFolder_tmp);//D:\software\eclipse\workspace2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\springMVC_upload\attached
        //区别在于是否是使用eclipse 来启动http服务(tomcat)
        String reg=".metadata\\.plugins";
        boolean isContain=realpath.contains(reg);
        System.out.println("[getUploadedPath]isContain:"+isContain);
        if(!isContain){
            webappPath=null;
        }
        // project name ,eg.shop_goods
        projectName = SystemHWUtil.deleteFrontSlash(projectName);
        realpath = SystemHWUtil.getRealPath(realpath, projectName);
        String result=null;//D:\software\eclipse\workspace2\springMVC_upload\src\main\webapp\attached
        if(!ValueWidget.isNullOrEmpty(webappPath)){
            //目的:把"http://localhost:8080/springMVC_upload/upload/image/"变为:
            //"http://localhost:8080/springMVC_upload/src/main/webapp/upload/image/"
            result=realpath.replaceAll("("+SystemHWUtil.deleteAfterSlash(uploadFolderName).replaceAll(File.separator.replace("\\", "\\\\")/* 因为\需要转义 */+"$", "") +"[\\/]?)$", webappPath.replace("\\", "\\\\")+"$1");
        }else{
            result=realpath;
        }
        System.out.println("[WebServletUtil.getUploadedPath]result:"+result);
        return result;
    }

相关常量

public static final String SRC_MAIN_WEBAPP="src\\main\\webapp\\";

5,spring MVC接收 jsonp 跨域请求

/***
     * 登录
     * @param model
     * @param status
     * @param view
     * @param session
     * @param request
     * @param callback
     * @return
     * @throws IOException
     */
    @ResponseBody
    @RequestMapping(value = "/login", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
    public String login(Model model, Integer status, UserView view,Integer issavePasswd,
            HttpSession session, HttpServletRequest request,HttpServletResponse response, String callback)
            throws IOException {
        init(request);
        String content = null;
        UserDao userDao = (UserDao) getDao();
        User user2 = null;
        Map map = new HashMap();
        int login_result = 0;
        AccessLog accessLog=logInto(request);
        accessLog.setDescription("会员登录");

        if (ValueWidget.isNullOrEmpty(view.getUsername())) {
            login_result = Constant2.LOGIN_RESULT_USERNAME_EMPTY;//用户名不能为空
            accessLog.setOperateResult("用户名不能为空");
        } else if (ValueWidget.isNullOrEmpty(view.getPassword())) {
            login_result = Constant2.LOGIN_RESULT_PASSWORD_EMPTY;//密码不能为空
            accessLog.setOperateResult("密码不能为空");
        } else if (ValueWidget.isNullOrEmpty(user2 = userDao.getByUsername(view
                .getUsername()))) {
            login_result = Constant2.LOGIN_RESULT_USERNAME_INVALID;//用户名不存在
            accessLog.setOperateResult("用户名不存在");
        } else if (!user2.getPassword().equals(view.getPassword())) {
            login_result = Constant2.LOGIN_RESULT_FAILED;//登录失败(用户名和密码不匹配)
            accessLog.setOperateResult("登录失败(用户名和密码不匹配)");
        } else {
            login_result = Constant2.LOGIN_RESULT_SUCCESS;
            session.setAttribute(Constant2.SESSION_KEY_LOGINED_USER, user2);
            map.put("session", session.getId());// 下载session id到客户端
            map.put("userId", user2.getId());// 下载session id到客户端
            System.out.println("session id:" + session.getId());
            Map mapCookie=new HashMap();
            if(issavePasswd/*包装类型*/!=null&&issavePasswd==1) {//记住密码
                mapCookie.put(Constant2.COOKIE_KEY_USERNAME, user2.getUsername());
                mapCookie.put(Constant2.COOKIE_KEY_PASSWORD, user2.getPassword());
            }else{
                mapCookie.put(Constant2.COOKIE_KEY_USERNAME, false);
                mapCookie.put(Constant2.COOKIE_KEY_PASSWORD, false);
            }
            WebServletUtil.rememberMe(request,response,mapCookie);
            accessLog.setOperateResult("登录成功,session id:"+session.getId());
        }
        // boolean isExist = userDao.isExist(view.getUsername(),
        // view.getPassword());

        map.put(Constant2.LOGIN_RESULT_KEY, login_result);
        logSave(accessLog, request);
        content = JSONPUtil.getJsonP(map, callback);
        return content;
    }
/***
     * 用于jsonp调用
     * @param map : 用于构造json数据
     * @param callback : 回调的javascript方法名
     * @param filters : <code>SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter
                .serializeAllExcept("content");
        FilterProvider filters = new SimpleFilterProvider().addFilter(
                Constant2.SIMPLEFILTER_JACKSON_PAPERNEWS, theFilter);</code>
     * @return : js函数名(json字符串)
     */
    public static String getJsonP(Object map,String callback,FilterProvider filters)
    {
        ObjectMapper mapper = getObjectMapper();
        String content = null;
        ObjectWriter writer=null;
        try {
            if(filters!=null){
//              content = mapper.writer(filters).writeValueAsString(map);
                writer=mapper.writer(filters);
            }else{
//              content = mapper.writeValueAsString(map);
                writer=mapper.writer();
            }
            content=writer.writeValueAsString(map);
            System.out.println(content);
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(ValueWidget.isNullOrEmpty(callback)){
            return content;
        }
        return callback+"("+content+")";
    }
    /***
     * jackson没有过滤
     * @param map
     * @param callback
     * @return
     */
    public static String getJsonP(Object map,String callback)
    {
        return getJsonP(map, callback, null);
    }
    public static String getJsonP(Object map)
    {
        return getJsonP(map, null, null);
    }
    /***
     * 
     * @param key
     * @param value2
     * @param callback
     * @return : js函数名(json字符串)
     */
    public static String getJsonP(String key ,Object value2,String callback){
        Map map = new HashMap();
        map.put(key, value2);
        return getJsonP(map, callback);
    }   

前端代码:

/***
 * 会员登录
 * @param username
 * @param password
 */
var user_login=function(username,password){
//    alert(username+","+password);
    if(isHasLogin())
    {
        alert(LOGIN_MSG_HAVE_LOGINED_ALREADY);
        //Toast.showShortCenter(LOGIN_MSG_HAVE_LOGINED_ALREADY);
        return;
    }
    showMask2();
    $.jsonP({url:'http://'+server_url+'/user/login?callback=?&username='+username+"&password="+password,success:function(data){
        var result=data.result;
        hideMask2();
        switch (result)
        {
            case 1:
                window.user={};
                window.sessionId=data.session;
                user.username=username;
                user.password=password;
                user.userId=data.userId;
                settings_before(document.getElementById("settings"));
                alert("登录成功");
                //plugins.toast.showShortCenter("登录成功");
                $.ui.goBack();
                break;
            case 3:
                alert("用户名不能为空");
                break;
            case 4:
                alert("密码不能为空");
                break;
            case 5:
                alert("用户名或密码错误");
                break;
            case 2:
                alert("用户名不存在");
                break;
        }

    }});
}
相关文章
|
20天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
33 4
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
149 2
|
3月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
4月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
|
3月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
67 2
|
3月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
230 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
4月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
5月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
5月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
5月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查