hualinux springMVC 5.9:视图和重定向

    技术2023-07-15  101

    目录

    一、简单的视图

    1.1 简单的例子

    1.2 视图解析工作过程

    二、相关知识

    2.1 概念

    2.2 常用的视图实现类

    视图解析器

    常用的视图解析器实现类

    InternalResourceViewResolver

    Excel 视图

    三、使用JSTL

    四、国际化

    4.1 添加依赖和配置文件

    4.2 实现代码 

    五、 标签

    六、自定义视图

    七、视图的重定向操作


    我们知道springMVC,MVC包括视图,一开始建立工程的时候就已经配置了,这里就不说了,直接上代码。

    一、简单的视图

    1.1 简单的例子

    我在《hualinux springMVC 5.2:使用 idea建立简单springMVC》文章中就已经建立一简单的视图了

    web-->WEB-INF-->dispatcher-servlet.xml 配置文件如下图:

    在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:

    @RequestMapping("/springmvc/testViewAndViewResolver") public String testViewAndViewResolver(){ System.out.println("testViewAndViewResolver"); return "ok"; }

    打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:

    <p><a href="springmvc/testViewAndViewResolver">Test ViewAndViewResolver</a></p>

    运行tomcat,idea会自动打开主页点,下面链接

     

    看到返回“ok,访问成功!”时,再看idea最下方的日志输出如下:

    testViewAndViewResolver

    1.2 视图解析工作过程

    理方法行完成后,最返回一个 ModelAndView 象。于那些返回 StringView ModeMap 型的理方法,Spring MVC 也会在内部将它装配成一个ModelAndView ,它包含了逻辑名和模型象的视图

    Spring MVC 借助视图解析器ViewResolver)得到最视图对象(View),最视图可以是 JSP ,也可能是ExcelJFreeChart 等各形式的视图

    对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦

     

    二、相关知识

    2.1 概念

    视图的作用是染模型数据,将模型里的数据以某形式呈现给

    实现视图模型和具体实现的解Spring org.springframework.web.servlet 包中定了一个高度抽象的 View接口:

    org.springframework.web.servlet.view.java

    视图对象由视图解析器负责实例化。由于视图无状的,所以他不会有线程安全问题

    2.2 常用的视图实现类

    视图解析器

    SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一或多解析策略并指定他的先后映射策略对应一个具体

    视图解析器实现类

    视图解析器的作用比较单一:将逻辑视图解析一个具体的视图对象。

    所有的视图解析器都必须实现 ViewResolver 接口:

    常用的视图解析器实现类

    程序员可以选择一种视图解析器或混用多种视图解析器视图解析器都实现Ordered 接口并放出一个 order 属性,可以通order 属性指定解析器的order 越小越高SpringMVC 会按视图解析器序的对逻辑视图行解析,直到解析成功并返回视图对象,否将抛出 ServletException

    InternalResourceViewResolver

    JSP 是最常见的视图技术,可以使用InternalResourceViewResolver 作为视图解析器:

    目中使用了 JSTLSpringMVC 会自视图InternalResourceView 转为 JstlView若使用 JSTL fmt 标签则需要在 SpringMVC 的配置文件中配置国源文件

    若希望直接响应SpringMVC 染的面,可以使用 mvc:view-controller 标签实现

    Excel 视图

    若希望使用Excel 展示数据列表,需要SpringMVC 提供的 AbstractExcelView AbstractJExcel View 即可。实现 buildExcelDocument() 方法,在方法中使用模型数据Excel 文档就可以了。AbstractExcelView 基于 POI API,而 AbstractJExcelView 是基于 JExcelAPI 的。视图对象需要配置 IOC 容器中的一个 Bean,使用BeanNameViewResolver 为视图解析器即可若希望直接在浏览器中直接下Excel 文档,可以响应头 Content-Disposition 值为attachment;filename=xxx.xls

    三、使用JSTL

    使用JSTL很简单,只需要氢jstl和standard的jar包复制到lib下即可 下载地址:https://tomcat.apache.org/download-taglibs.cgi

     

    四、国际化

    4.1 添加依赖和配置文件

    在pom.xml添加如下依赖

    <!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl --> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-spec --> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.5</version> </dependency>

    在src\main\resources下建立3个配置类:l18n.properties、l18n_zh_CN.properties、l18n_en_US.properties

    内容分别为:

    l18n.properties

    i18n.username=Usernmae i18n.password=Password

    l18n_zh_CN.properties

    因为我用的是UTF-8,所以要用UTF-8在线转换工具 http://tool.chinaz.com/tools/utf-8.aspx

    #下面两行特殊字符串分别是UTF-8编码,中文的“用户名”“密码”的意思 i18n.username=&#x7528;&#x6237;&#x540D; i18n.password=&#x5BC6;&#x7801;

    l18n_en_US.properties

    i18n.username=Usernmae i18n.password=Password

    dispatcher-servlet.xml, 添加如下配置:

    <!-- 配置国际化资源文件 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="l18n"/> </bean>

     

    4.2 实现代码 

    在web/ index.jsp,添加如下代码:

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> … <p><fmt:message key="i18n.username"></fmt:message></p> <p><fmt:message key="i18n.password"></fmt:message></p>

    运行测试,发现找不到fmt,这里我不解决,在为实际国际化不会放配置文件中,一般放数据库中,以下是我旧版本做出的结果:

    打开IE浏览器,尾部添加/springmvc/testViewAndViewResolver,结果如下:

    因为我IE10浏览器是中文的,现在设置为英文试下

    然后按ctlr+F5强制刷新页面,发现变成了英文了

    五、 <mvc:view-controller>标签

    springMVC的配置文件中使用<mvc:view-controller>标签可以使得url不需要进入handler处理方法,就可以直接跳转页面,配置方法如下

    web/WEB-INF/dispatcher-servlet.xml, 添加如下配置:

    <!-- 配置直接进行转发的页面,无须进入handler方法 --> <mvc:view-controller path="/ok" view-name="ok" />

    注:添加这个还需要添加多一个     <mvc:annotation-driven />,不然的话,index.jsp主页上所有链接将失效

    根据如上的配置,直接在idea打开的浏览器尾部添加ok,就可以跳转至ok.jsp页面,而无需进入handler处理方法,更不需要进行@RequestMapping映射。

     

    六、自定义视图

    自定义视图,使用它可以很好的和jfreecharexcel整合,下面来具体说明。

    首先新建一个视图,新建一个类,继承view接口,然后覆盖里面的方法,代码如下:

    在src/main/java/com.hualinux.springmvc.handers/HelloView.java,代码如下:

    package com.hualinux.srpingmvc.handers; import org.springframework.stereotype.Component; import org.springframework.web.servlet.View; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date; import java.util.Map; @Component public class HelloView implements View { @Override public String getContentType() { return "text/html"; } @Override public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.getWriter().print("hello view,time:"+new Date()); } }

    如上所示,写一个类,继承View接口,然后覆盖里面的方法,就可以自己自定义视图了,但是目前这个视图还没有用,需要在dispatcher-servlet的配置文件中进行配置,才能使用这个视图,配置方法如下:

     

    web/WEB-INF/dispatcher-servlet.xml添加如下配置:

    <!-- 视图解析器 BeanNameViewResolver:使用视图的名字来解析视图 --> <!-- 定义property属性来定义视力的优先级,order值越小,越优先,InternalResourceViewResolver视图的order最高为int最大值 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="10" /> </bean>

    如上的配置,那么这个视图就可以使用了,然后我们写一个handler处理方法

    在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码

    @RequestMapping("/springmvc/testView") public String testView(){ System.out.println("hello view"); return "helloView"; }

    打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:

    <p><a href="springmvc/testView">Test View</a></p>

    运行tomcat,idea会自动打开主页点,下面链接

    再看idea最下方的日志输出如下:hello view

     

    七、视图的重定向操作

    上面所说的全部都是视图的转发,而不是重定向,这次我来讲一下重定向是怎么操作的。

    只要字符串中以forward或者redirect开头,那么springMVC就会把它解析成关键字,然后进行相应的转发,或者重定向操作

    web/ t1.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <html> <head> <title>test1</title> <meta charset="UTF-8"> </head> <body> <h3>this ia a t1</h3> <h3>这个是t1.jsp页面</h3> </body> </html>

    在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:

    /* * 测试视图的重定向 * 只要在字符串中加了foword或者redirect开头,springMVC就会把它解析成关键字,进行相应原转发重定向操作 * */ @RequestMapping("/springmvc/testRedirect") public String testRedirect(){ return "redirect:/t1.jsp"; } /* * 测试视图的转发 * 只要在字符串中加了foword或者redirect开头,springMVC就会把它解析成关键字,进行相应原转发重定向操作 * */ @RequestMapping("/springmvc/testForward") public String testForward(){ return "forward:/t1.jsp"; }

    分别是重定向与转发操作,其实不止java代码,<mvc:view-controller>标签中的返回视图,也可以加上redirect或者forward字符串,也会进行相应的操作。

    在web/ index.jsp,添加如下代码:

    <p><a href="springmvc/testRedirect">Test Redirect</a></p> <p><a href="springmvc/testForward">Test Forward</a></p>

    运行tomcat并分别点上面的链接效果如下:

    下面是Redirect效果,url直接变了

    点 Test Forward

    点 Test Redirect

    Processed: 0.009, SQL: 9