jsp跳转servlet:JSP和Servlet的跳转及得到路径思路方法整理

今天整理项目流程在JSP和Servlet的间跳来跳去曾经段时间我都是把Servlet路径定义为“/SomeServlet”也即定义为根目录兼容性比较好但是用了MyEclipse的后新建Servlet默认路径是“/servlet/SomeServlet”这样写便于管理另外就是更适合单独为Servlet设置Filter(有关Filter设置可以参考这篇文章)而我JSP文件目前是放在项目根目录也即形成下图这样路径结构:

/ProjectRoot/
  |--servlet/
  |  |--Servlet1
  |  |--Servlet2
  |
  |--myJsp1.jsp
  |--myJsp2.jsp

其中Servlet跳转有两种方式:
1、sendRedirect方式

response.sendRedirect(String targetUrl);
2、RequestDispather方式

RequestDispatcher requestDispatcher = request.getRequestDispatcher(String targetUrl);
requestDispatcher.forward(request, response);

种方式是给用户浏览器发送通知然后由浏览器再给服务器发送跳转请求所以比较类似用户自己去点URL跳转这种方式如果需要传参给跳转页面需要使用Session或者使用GET方式将参数显式写在targetUrl里(如:ooxx.jsp?id=1)而且大部分情况下由于GET思路方法局限性这种跳转方式只能带较为简单参数

而第 2种方式有点类似C#中Server.Transfer思路方法即服务器端跳转从现象上看就是用户浏览器内容发生了变化但是浏览器地址栏不变还是老地址这种方式由服务器直接控制request及response走向及参数从命令行参数上就可以看出这这样方便员控制参数传递几乎可以传递任何类型参数只要简单使用Attribute思路方法即可:

request.Attribute(String attriName, Object attriValue);

但是也就是它是服务器端跳转所以用户浏览器地址栏是不发生变化那么如果项目路径结构如上图所示情况那么:
1、从JSP跳转向Servlet时
只要简单使用相对路径“serlvet/SomeServlet”即可

2、从Servlet跳转向另个Servlet时
Servlet都在相同路径下所以可以直接写相对路径如“./SomeServlet”或直接“SomeServlet”

3、从Servlet跳转向JSP时
Servlet路径为“servlet/SomeServlet”所以如果要使用RequestDispather方式跳转JSP页面在接参数时会将地址栏地址作为当前目录寻找自己需要思路方法、JavaScript、CSS等所以经常有朋友遇到JavaScript报错“Ext未定义”就是JSP页面找不到Extjs文件所以这种情况需要使用绝对路径来告诉JSP去哪里得到这些资源JAVA有关获得路径思路方法较多测试如下:

项目根目录:http://localhost:8080/TestProject/
JSP测试:http://localhost:8080/TestProject/TestPath.jsp

1<%@ page language="java" contentType="text/html; char=UTF-8"
2 pageEncoding="UTF-8"%>
3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4<html>
5<head>
6<meta http-equiv="Content-Type" content="text/html; char=UTF-8">
7<title>Insert title here</title>
8</head>
9<body>
10<%="request.getContextPath = " + request.getContextPath + "<BR />"%>
11<%="request.getServletPath = " + request.getServletPath + "<BR />"%>
12<%="request.getRequestURI = " + request.getRequestURI + "<BR />"%>
13<%="request.getRequestURL = " + request.getRequestURL + "<BR />"%>
14<%
15 String realPath = session.getServletContext.getRealPath("/");
16%>
17<%="request.getRealPath(\"/\") = " + realPath + ""%>
18</body>
19</html>
返回结果:

request.getContextPath = /TestProject
request.getServletPath = /TestPath.jsp
request.getRequestURI = /TestProject/TestPath.jsp
request.getRequestURL = http://localhost:8080/TestProject/TestPath.jsp
request.getRealPath("/") = C:\Tomcat\webapps\TestProject\

Servlet测试

1package servlet;
2
3import java.io.IOException;
4import java.io.PrWriter;
5
6import javax.servlet.ServletException;
7import javax.servlet.http.HttpServlet;
8import javax.servlet.http.HttpServletRequest;
9import javax.servlet.http.HttpServletResponse;
10import javax.servlet.http.HttpSession;
11
12public TestPath extends HttpServlet {
13
14 private final long serialVersionUID = 3093731648408094325L;
15
16 public void doGet(HttpServletRequest request, HttpServletResponse response)
17 throws ServletException, IOException {
18
19 response.ContentType("text/html");
20 PrWriter out = response.getWriter;
21 out.prln("request.getContextPath = " + request.getContextPath + "<BR />");
22 out.prln("request.getServletPath = " + request.getServletPath + "<BR />");
23 out.prln("request.getRequestURI = " + request.getRequestURI + "<BR />");
24 out.prln("request.getRequestURL = " + request.getRequestURL + "<BR />");
25 HttpSession session = request.getSession;
26 String realPath = session.getServletContext.getRealPath("/");
27 out.prln("request.getRealPath(\"/\") = " + realPath + "");
28 out.flush;
29 out.close;
30 }
31
32 public void doPost(HttpServletRequest request, HttpServletResponse response)
33 throws ServletException, IOException {
34 doGet(request, response);
35 }
36
37}
返回结果:

request.getContextPath = /TestProject
request.getServletPath = /servlet/TestPath
request.getRequestURI = /TestProject/servlet/TestPath
request.getRequestURL = http://localhost:8080/TestProject/servlet/TestPath
request.getRealPath("/") = C:\Tomcat\webapps\TestProject\

这样就目了然了另外要特别说下getRealPath这个思路方法用于得到URL物理磁盘路径以前写法很简单request.getRealPath(String path)即可但是此思路方法已被废弃现在要用ServletContext.getRealPath(String path)也就是说要先得到ServletContext对象而这个对象获得方式有好几种比较简单无非是从Session中获得:

HttpSession session = request.getSession;
String realPath = session.getServletContext.getRealPath("/");
还有几种思路方法同样可以获得ServletContext:

Javax.servlet.http.HttpSession.getServletContext
Javax.servlet.jsp.PageContext.getServletContext
Javax.servlet.ServletConfig.getServletContext

以上
Tags:  jsp和servlet jsp和servlet的区别 jspservlet jsp跳转servlet

延伸阅读

最新评论

发表评论