本来是不想写的,但是忽然发现今天是201314,要等5201314(5201-3-14)要等几千年啊。作为一个单身屌丝无论如何都要留下些东西,什么也好,写点吧。
本文主要介绍spring mvc如果拦截了所有请求怎么返回jstl、json、xml视图,访问静态文件,以及使用dwr,我把这几个都集中到一个工程,看看他们是怎样协同工作的。
阅读本文前需要对spring mvc和dwr有基本了解
不多说,去图,目录结构:
其他文件不看,就看主要的,要项目的可以在后面给出的链接下载,不需要积分,多点下载啊,我要积分!!!
这是web.xml的有关配置,重点是dwr的url要用相同的serlvet配多一次。
contextConfigLocation
/WEB-INF/test-service.xml
org.springframework.web.context.ContextLoaderListener
test
org.springframework.web.servlet.DispatcherServlet
1
test
/
test
/dwr/*
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
这是test-serlvet.xml的部分配置,详细请去下载源码来看。
下面看是配置视图:
这个是json视图,配置起来比较简单:
这个是xml视图,配置的时候可以看看注释:
这个是jstl视图,找不到匹配的视图的时候就会找这个,一般返回字符串的controller会找这个视图
dwr的配置,大家看看注释,有过dwr的基础的应该不难,记得要定义可以暴露的类,没有定义的话是不会作转换处理的
下面是对静态资源做处理,把静态资源放到某几个文件夹下面,由url的前缀决定是否把这个请求视为静态资源
几个种类的请求及视图的配置基本上就是那么多,下面看看怎么返回这些视图,我用2个controller简单的演示完,一个是dwr的,一个是出了dwr以外的。
先看看dwr的:
package com.web.dwr;
import org.directwebremoting.annotations.RemoteMethod;
import org.directwebremoting.annotations.RemoteProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.model.Account;
import com.service.interfaces.AccountService;
@Controller
@RemoteProxy(name = "dwrTest")
public class DwrTestController {
@Autowired
private AccountService accountService;
public void setAccountService(AccountService accountService) {
this.accountService = accountService;
}
@RemoteMethod
public Account getJsonTest() {
return accountService.getAccount();
}
}
@RemoteProxy注解标记要暴露给前台使用的类,前提是这个包要被spring扫描,所以要配好xml扫描包和加上@Controller注解
这是前台js调用dwr的过程
var showInfo = function() {
dwrTest.getJsonTest(function(data) {
alert("账号是:" + data.account + "\n密码是:" + data.password
+ "\n姓名是:" + data.student.name + "\n性别是:" + data.student.sex);
});
};
启用dwr要引入几个文件,是经过spring过滤的几个文件:
dwrTest就是刚才注解的name属性。
下面是jstl,json,xml视图的controller:
package com.web.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.model.Account;
import com.service.interfaces.AccountService;
@Controller
public class TestController {
@Autowired
private AccountService accountService;
public void setAccountService(AccountService accountService) {
this.accountService = accountService;
}
@RequestMapping(value = "/jsptest.html", method = RequestMethod.GET)
public String jspTest(Model model) {
model.addAttribute("account", accountService.getAccount());
return "indextest";
}
@RequestMapping(value = "/jsontest.html", method = RequestMethod.GET)
public ModelAndView jsonTest() {
ModelAndView model = new ModelAndView("jsontournamenttemplate");
model.addObject("myAccount", accountService.getAccount());
model.addObject("success", true);
return model;
}
@RequestMapping(value = "/xmltest.html", method = RequestMethod.GET)
public ModelAndView xmlTest() {
ModelAndView model = new ModelAndView("xStreamMarshallingView");
Account account = accountService.getAccount();
model.addObject(BindingResult.MODEL_KEY_PREFIX, account);
return model;
}
}
返回字符串的是jstl视图,返回ModelAndView的会根据构造函数设的参数寻找这个名字对应的bean的视图。xml视图addObject的时候如果不设置key是BindingResult.MODEL_KEY_PREFIX的话有可能响应出一大堆无关的信息,但是另一个工程则没有出现这种状况,原因不明,望高人指点。
下面是jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
spring mvc url测试
controller传过来的数据
用户账号
用户密码
学生姓名
学生性别
${account.account}
${account.password}
${account.student.name}
${account.student.sex}
下面是spring mvc访问静态路径的文件的图片
访问json字符串:/sprjson/jsontest.html
访问xml字符串:/sprjson/xmltest.html
访问
http://localhost:8080/sprjson/jsptest.html
可以经过controller跳到jsp页面,该页面的图片和静态的js文件可以正常引入,按那两个json视图和xml视图的链接可以得出json视图和xml视图。
访问
http://localhost:8080/sprjson/jsontest.html
的结果
访问
http://localhost:8080/sprjson/xmltest.html
的结果
这里显示的属性是中文是由于在xml配置文件设置了属性的别名的原因。