1. SpringMVC与Servlet的关系html
SpringMVC框架是创建在Servlet之上的,提供各类功能,各类封装,各类方便的同时,它一点儿也没有限制Servlet,咱们彻底能够在SpringMVC的controller中,彻底按照Servlet的方式来写代码,同时还享受SpringMVC提供的方便。因此咱们彻底没有理由再使用Servlet了。web
2. SpringMVC 返回 html 视图页面spring
SpringMVC的controller通常咱们能够配置返回:jsp, json, Velocity, FreeMarker, XML, PDF, Excel等等视图。那么如何返回到 html 视图呢?固然通常咱们没有这种必要,可是有一些奇葩场景仍是存在的。json
上面咱们知道SpringMVC没有限制对Servlet有任何的限制,咱们彻底能够在controller中写servlet形式的代码,而咱们知道,咱们在Servlet中能够经过 转发和重定向到 html 类型的页面,因此咱们也能够在SpringMVC的controller中利用request的转发和response的重定向到html页面,也能够利用PrintWriter直接输出html字符流。这些Servlet中的用法,咱们彻底能够在SpringMVC中使用。浏览器
@RequestMapping(value="/htmlView") public void htmlView(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ // ... // request.getRequestDispatcher("index.html").forward(request, response); response.sendRedirect("http://www.baidu.com"); }
@RequestMapping(value="/getPage") public void writeSubmitHtml(Reader reader, Writer writer, HttpSession session) throws IOException { User user = (User) session.getAttribute(ConstantConfig.LONGIN_USER); StringBuffer sbHtml = new StringBuffer(); sbHtml.append("<!doctype html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"); sbHtml.append("<title>支付宝即时到帐交易接口</title></head><body>"+ user.getNo() +"</body></html>"); writer.write(sbHtml.toString()); }
上面分别使用 request的转发和response的重定向,以及PrintWriter直接输出html字符流,到达springMVC返回 html 类型视图的目的。服务器
3. Servlet重定向与转发session
下面的文字,转自:http://blog.sina.com.cn/s/blog_7ffb8dd501013tbg.htmlapp
1、请求转发与响应重定向的种类框架
有两种方式得到Servlet 转发对象(RequestDispatcher):jsp
一种是经过HttpServletRequest的getRequestDispatcher()方法得到,
一种是经过ServletContext的getRequestDispatcher()方法得到。
Servlet 重定向的方法只有一种:HttpServletResponse的sendRedirect()方法。
这三个方法的参数都是一个URL形式的字符串,但在使用相对路径或绝对路径上有所区别。
2、请求转发与响应重定向中路径参数区别
假设经过http://localhost/myApp/cool/bar.do 请求到达该方法所属的Servlet。
一、响应重定向 ◆ HttpServletResponse.sendRedirect(String)
参数能够指定为相对路径、绝对路径或其它Web应用。
i:相对路径:response.sendRedirect("foo/stuff.do"),容器相对于原来请求URL的目录加参数来生成完整的URL——http://localhost/myApp/cool/foo/stuff.do。
ii:绝对路径:response.sendRedirect("/foo/stuff.do"),容器相对于Web应用自己加参数创建完整的URL,这是由于重定向response.sendRedirect("")是服务器向客户端发送一个请求头信息,由客户端再请求一次服务器,请求是在服务器外进行的,
因此完整的url是——http://localhost/foo/stuff.do。
iii:其它Web应用:response.sendRedirect("http://www.xxx.com ")容器直接定向到该URL。
二、请求转发 ◆HttpServletRequest.getRequestDispatcher(String)
参数能够指定为相对路径或绝对路径。
i:相对路径状况下生成的完整URL与重定向方法相同。
ii:绝对路径与Servlet重定向不一样,容器将相对于Web应用的根目录加参数生成完整的URL(即“/”根路径就是相对于虚拟路径)这是由于转发是在服务器内部进行的,写绝对路径/开头指的是当前的Web应用程序。即:
request.getRequestDispatcher("/foo/stuff.do")生成的URL是http://localhost/myApp/foo/stuff.do 。
三、 ◆ ServletContext.getRequestDispatcher(String)
参数只能指定为绝对路径,生成的完整URL与HttpServletRequest.getRequestDispatcher(String)相同。
##################################
同理:
例如在web.xml中注册以下的servlet:
<servlet>
<servlet-name>addStudent</servlet-name>
<servlet-class>org.mytest.addStudent</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addStudent</servlet-name>
<url-pattern>/servlet/addStudent</url-pattern>
</servlet-mapping>
假如说,你工程名字为HibernateApp3,JSP页面提交表单给servlet时有两种写法:
1.相对路径: <form action=servlet/addStudent method=post>...</form>
2. 绝对路径: <form action="/HibernateApp3/servlet/addStudent" method=post>...</form>
或者 <form action="<%=request.getContextPath() %>/servlet/addStudent" method=post>...</form>
注意:/表明根目录,若是路径是使用/开头,Tomcat就是webApp那个目录,若是你不是/开头表明你从当前工程的目录开始,例如:webApp/HibernateApp3/
这一点很是重要,不少提交表单时发生的错误都是由于提交路径出错形成的。
附、<a href>的路径若是是"/"开头,则表示相对于主机,若是不是则表示相对于当前请求
综上所述:
这里最最关键的要能清楚发出请求目的资源的请求是在服务器内部仍是服务器外部:内部时,“/”就是项目的虚拟目录;外部时,“/”就是表明主机的根目录
注意:response.sendRedirect 是先返回浏览器,再由浏览器从新定向到某个页面,因此他能够重定向到任何页面,包括其它站点的页面,好比从咱们本身的网站,重定向到http://www.baidu.com 都是能够的,这是有其原理决定的。