由于是基于maven的项目,所以基础的spring与jersey包都可以从mavenrepository网站得到:http://mvnrepository.com/
除此之外,要想实现基于JSP模板的MVC模式jersey结构,当然还需要jersey-mvc-x.jar 和jersey-mvc-jsp-x.jar。都可以在mavenrepository中得到。
目的:通过一个小demo,来实现viewable或者request请求转发实现jersey的rest请求到JSP页面的跳转过程的说明。
项目结构:
A:创建jersey资源映射配置类ResourceConfig
public class RestApplication extends ResourceConfig {
public RestApplication() {
//服务类所在的包路径
packages("com.xiansky.action");
//注册JSON转换器
register(JacksonJsonProvider.class);
register(JspMvcFeature.class); //注册MVC支持
property(JspMvcFeature.TEMPLATE_BASE_PATH, "/");//jsp文件所在位置,当前JSP文件是在项目根目录下
}
}
B:配置jersey相关的web.xml
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:applicationContext.xml
</param-value>
</context-param>
<servlet>
<servlet-name>jerseyServlet1</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.xiansky.action.RestApplication</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.feature.Redirect</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jersey.config.servlet.filter.forwardOn404</param-name>
<param-value>true</param-value>
</init-param>
<!-- <load-on-startup>1</load-on-startup> -->
</servlet>
<servlet-mapping>
<servlet-name>jerseyServlet1</servlet-name>
<url-pattern>/jsp/*</url-pattern>
</servlet-mapping>
</web-app>
@Controller("viewJsp")
@Path("/view")
public class ViewJsp {
Log log = LogFactory.getLog(ViewJsp.class);
//通过request请求转发方式从rest风格的请求跳转到jsp页面-传递request域参数
@GET
@Path("/dispatcher")
public void renderToJSP(@Context HttpServletRequest request,@Context HttpServletResponse response){
log.info("request dispatcher...to jsp");
try {
request.setAttribute("demo", "I LOVE LIUZHOU");
//请求转发
request.getRequestDispatcher("/demo.jsp").forward(request, response);
} catch (Exception e) {
log.error(e+"request dispatcher fail");
}
}
//通过viewable进行基于MVC模式的页面跳转,并可以封装参数到request域或者到viewable构造器第二个参数object(model)中
@GET
@Path("/template/{city}")
@Produces(MediaType.TEXT_HTML)
public Viewable loveCityName(@PathParam("city")String cityName,@Context HttpServletRequest request){
log.info("use viewable tech render to jsp page >>>>>>>"+ cityName);
//可以将属性设置到request域中,跳转后的jsp页面亦可从request域中取出
request.setAttribute("demo", "TOJSP");
//jersey viewable进行Jsp页面跳转
return new Viewable("/index",cityName);
}
}
D:跳转到的Jsp页面,获取参数并显示
demo.jsp ->request转发的页面。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String info = String.valueOf(request.getAttribute("demo"));
%>
<span><%=info %></span>
</body>
</html>
index.jsp -->viewable跳转到的jsp页面
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String city = String.valueOf(request.getAttribute("model")); //此处注意通过new Viewable("..",object);request只能通过指定'model'属性获取值
String info = String.valueOf(request.getAttribute("demo"));
%>
<span>I LOVE <%=city %>, <%=info %></span>
</body>
</html>
E:测试:
总结:
重点是在A中的recourseConfig中对JSPMVC一些基础类进行注册和jsp基路径进行配置,以至于在后面通过viewable跳转jsp页面时候可以查找得到。还有通过viewable跳转到jsp中,在jsp中通过getAttribute方法只能获取指定的“model”属性,才能得到viewable传递过来的object内容。