读书人

spring页面技术议论

发布时间: 2012-07-04 19:33:55 作者: rapoo

spring页面技术讨论

这段时间做的一个新项目用到了久未接触的spring,也趁着这段时间重新学习了一下。

其实也不能算重新学习,因为spring mvc以前接触的很少。

看过好多童鞋拿spring的MVC和struts来对比,其实我觉得大可不必,喜欢哪个用哪个罗,或者公司规定哪个就用哪个。一种技术的流行总有它的优点的。

这种见仁见智的东西就不多说了。

直接来看看例子。

今天我们来讲的是spring mvc跟其他页面显示技术的结合,如jsp,freemarker,velocity。我只用过这三个,其他没用过的不好说,等各位朋友们自己研究啦。下面进正题。

1)我们要用spring mvc,首先还是需要进行相关的配置,在web.xml中进行中心控制器的配置,(中文控制器是在struts中的说法,但spring中没有一个明确的说明指明DispatcherServlet是叫什么,暂且这样来叫)。见代码:

<servlet>  <servlet-name>dispatcherServlet</servlet-name>  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  <init-param>  <param-name>contextConfigLocation</param-name>  <param-value>WEB-INF/applicationContext.xml</param-value>  </init-param>  <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>  <servlet-name>dispatcherServlet</servlet-name>  <url-pattern>/</url-pattern>  </servlet-mapping>
?

?这里一般应该都没问题的。特别要注意的一点就是spring的url-pattern这里不同于其他的框架,其他都是用/*,而这里url-pattern是用/,因为我们不想让它匹配.jsp,.html,.htm结尾的文件。

2)配置了控制器,当有相应的链接时,比如我们有一个

http://localhost:8080/Spring_MVC/login

请求,它首先会被DispatcherServlet进行拦截,然后再在spring的配置文件中进行查找对应的Controller。

我们看到上面,有一个contextConfigLocation属性,这个值指明了spring的配置文件的位置。

applicationContext.xml中我们需要配置viewResolver,handlerMapping,实际上handlerMapping可以不用配置,因为spring默认会使用beanNameUrlHandlerMapping这个来进行请求的查询。但我在例子中是用了simpleUrlHandlerMapping

看代码:

<bean name="login" /><bean id="simpleUrlHandlerMapping" ><!-- 每一个view逻辑名对应一个bean --><property name="mappings"><props><prop key="/login">login</prop></props></property></bean><bean id="viewResolver"name="code">public class UserLogin implements Controller{public ModelAndView handleRequest(HttpServletRequest arg0,HttpServletResponse arg1) throws Exception {ModelAndView mav = new ModelAndView();//设置视图逻辑名mav.setViewName("message");mav.addObject("message","跳转过来啦");return mav;}}

?很简单的类,我们没有做什么参数的接收。Controller必须要实现Controller接口或者继续Controller的实现类,这个我们先不讲。

例子中很简单的设了一个参数,message,它的值为“跳转过来啦”,而我们有一个页面message.jsp

只有一句代码:

${message }

?其他是HTML的基本框架代码。这里我们取出在上一个Controller中设入的message值。

我们是从login.jsp中进行跳转过来的,它的代码如下:

<a href="<%=request.getContextPath() %>/login" >调用UserLogin这个Controller</a>

?其他是HTML的基本代码,所以不贴出来了。

?

当我们从UserLogin中返回ModelAndView时,上面的ViewResolver就发挥它的作用了,它在项目的根目录下(因为我们没有设置prefix),寻找与viewName名称相同的jsp文件(因为我们设置了suffix为.jsp)。于是就找到了我们在根目录下的message.jsp。我们看效果:

spring页面技术议论

当我们点击上面的链接后,我们调用loginController,效果为:

spring页面技术议论

跳转很正常。证明我们对JSP的处理是没问题的。

?

3)上面我们是进行处理JSP的,下面我们来看一下spring对Freemarker的支持。

这里我们需要修改上面的applicationContext.xml,修改ViewResolver,并且需要添加一个FreeMarkerConfigurer来配置freemarker的模板位置和其他信息。我们直接见代码:

首先我们需要去掉上面的viewResolver,另外添加的如下:

<bean id="freemarkerConfig"name="code">public ModelAndView handleRequest(HttpServletRequest arg0,HttpServletResponse arg1) throws Exception {ModelAndView mav = new ModelAndView();mav.setViewName("listReaders");Reader reader = new Reader();reader.setName("shun");reader.setPassword("123456");Reader reader2 = new Reader();reader2.setName("shun2");reader2.setPassword("123456(2)");List<Reader> readers = new ArrayList<Reader>();readers.add(reader2);readers.add(reader);mav.addObject("readers",readers);return mav;}

?这里我们设了一个list,把两个reader设到list里面,方便我们进行演示。reader很简单的,就两个属性和相应的get/set方法,大家自己写一下就OK了,这里不帖出那部分代码了。

在上面的freemarker的viewResolver会在/WEB-INF/freemarker(前缀)文件夹下,查找listReaders.vm(vm是后缀)。

我们的listReaders.vm可以新建html文件进行修改,内容如下:

<#list readers as reader>姓名:${reader.name}密码:${reader.password}<br/></#list>

?这里进行循环,关于freemarker的语法大家可以在网上找些资料看看。

我们来看看效果,login.jsp不变,我们点击后跳转到listReaders.vm:

spring页面技术议论

这里我们没有乱码是因为我们设置了defaultEncoding和contentType,所以显示正常,大家可以试试把其中一个去掉,那么就会出现乱码了。

?

4)上面我们看了freemarker和JSP的显示,下面我们来看看velocity,这里我们只修改applicationContext.xml,修改viewResolver和configurer,首先我们把上面添加的freemarker的viewResolver和freemarkerConfigurer,另外添加如下:

<bean id="viewResolver"name="code">#foreach($reader in $readers)姓名:${reader.name}密码:${reader.password}<br/>#end

?它的效果和上面的freemarker一样。

?

注意,为了避免不必要的乱码,建议所有文件都统一编码,如果非UTF-8则需要相应上面例子中的相应编码。

?

5)spring来提供了其他对pdf和xml等的相关支持,这些由于暂时没用到,没多研究。

暂时就先跟大家分享这些。

??

读书人网 >软件架构设计

热点推荐