zoukankan      html  css  js  c++  java
  • Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象

    SpringMVC使用细节
    第一节 视图解析器

    通过HelloWorld程序我们看到了handler方法的返回值表示:

    请求处理完成后,请SpringMVC执行一个请求转发。转发的地址就是handler方法的返回值。
    

    假设我们在/WEB-INF/pages目录下有一组JSP页面,那么访问它们的路径都是以“/WEB-INF/pages/”开头,以“.jsp”结尾。基于这样一种情况,SpringMVC做了一种设计:它允许我们把转发路径中前面的固定部分和后面的固定部分以前缀、后缀的形式写到配置文件中,然后我们的handler方法就仅仅指定中间不一样的部分即可。中间部分和前缀、后缀做字符串拼接。这就是SpringMVC提供的视图解析器,我们在SpringMVC的配置文件中加入下面的配置,视图解析器就生效了。

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    

    有了视图解析器,handler方法的返回值就简单了:

    @RequestMapping("/hello")
    public String hello() {
        System.out.println("SpringMVC处理了这个请求!");
        return "result";
    }
    

    SpringMVC会使用上面方法的返回值“result”和前缀后缀做字符串拼接,从而得到转发路径。
    “/WEB-INF/pages/”+“result”+".jsp"→"/WEB-INF/pages/result.jsp"

    然后按照拼接得到的结果转发请求。

    第二节 @RequestMapping注解使用在类级别

    假设我们在同一个模块有下面几个方法:

    @RequestMapping("/user/login")
    public String login() {
        return "result";
    }
    
    @RequestMapping("/user/register")
    public String register() {
        return "result";
    }
    
    @RequestMapping("/user/logout")
    public String logout() {
        return "result";
    }
    

    它们在@RequestMapping注解中的映射地址都是以/user开头,能否统一提取出来呢?很简单,在类上再使用一个@RequestMapping注解把/user部分提取出来即可。

    @Controller
    @RequestMapping("/user")
    public class UserHandler {
        @RequestMapping("/login")
        public String login() {
            return "result";
        }
        @RequestMapping("/register")
        public String register() {
            return "result";
        }
        @RequestMapping("/logout")
        public String logout() {
            return "result";
        }
    }
    

    访问的效果是一样的。

    第三节 获取原生Servlet API对象
    1.提出问题
    在Servlet的doGet()方法中,我们可以拿到原生、本真的HttpServletRequest和HttpServletResponse这样的对象,那么在SpringMVC的handler方法中能够拿到吗?

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ……
    }
    

    完全可以,直接从handler方法的参数位置传入即可。
    2.直接传入handler方法

    @RequestMapping("/testOriginalObject")
    public String testOriginalObject( HttpServletRequest request,  HttpServletResponse response,  HttpSession session) {
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
        return "result";
    }
    

    结果:

    org.apache.catalina.connector.RequestFacade@d57f488
    org.apache.catalina.connector.ResponseFacade@3b9b53b
    org.apache.catalina.session.StandardSessionFacade@27f11e41
    

    3.ServletContext对象
    方法一:通过HttpSession对象获取
    session.getServletContext()
    方法二:使用@Autowired注解装配
    @Autowired
    private ServletContext servletContext;

  • 相关阅读:
    内网渗透中命令行下文件分卷压缩
    Windows&Linux重置nessus的密码
    mac 安装zmap
    Java的几种时间
    Hadoop-MR实现日志清洗(四)
    Hadoop-MR实现日志清洗(三)
    Hadoop-MR实现日志清洗(二)
    Hadoop-MR实现日志清洗(一)
    关于Hive正则技术处理比较规范的日志数据
    创建一个普通的Java项目,编写MapReduce程序
  • 原文地址:https://www.cnblogs.com/javawxid/p/12812074.html
Copyright © 2011-2022 走看看