http://hi.baidu.com/tlogin/item/ece52b1a563a94ff756a8430
问题:想在控制层里,直接使用404,让web服务器自己来处理。
一、无返回值时。
1、转向301、404、302。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//301
@RequestMapping
(
"/{urldir:[a-z]+}"
)
public
void
gotodir(
@PathVariable
(
"urldir"
) String urldir,Map<String, Object> map, HttpServletRequest request,HttpServletResponse response){
String basePath = urldir +
"/"
;
response.setStatus(
301
);
response.setHeader(
"Location"
, basePath);
//response.sendRedirect("/page"); 会返回302,不利于搜索引擎。
}
//404
@RequestMapping
(
"/{urldir:[a-z]+}"
)
public
void
gotodir(
@PathVariable
(
"urldir"
) String urldir,Map<String, Object> map, HttpServletRequest request,HttpServletResponse response){
response.setStatus(
404
);
// <error-page>
// <error-code>404</error-code>
// <location>/WEB-INF/pages/msg.jsp</location>
// </error-page>
//在web.xml设置了404捕获时,也不能捕获,直接由Web容器(tomcat)处理404输出。注意:没有在Spring下配置异常捕获来测试。
//response.sendError(404); 使用发送错误方法时,web.xml设置了404捕获时,可以使用设置的msg.jsp来输出内容,且返回浏览器的状态也是404。
}
|
以上都会在代码执行完毕后,才进行跳转,可以在最后加上System.out.println("也会执行到这步来!");
2、输出指定内容以及返回指定文件类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//PrintWriter(jspWriter)
@RequestMapping
(
"/{urldir:[a-z]+}"
)
public
void
gotodir(
@PathVariable
(
"urldir"
) String urldir,Map<String, Object> map, HttpServletRequest request,HttpServletResponse response)
throws
IOException{
//response.setCharacterEncoding("utf-8");
response.setContentType(
"text/xml;charset=utf-8"
);
//setContentType 可以指定返回的文件类型,做下载时会和到这个方法。
PrintWriter jw= response.getWriter();
jw.print(
"en英文"
);
System.out.print(
"后台输出"
);
//jw.flush(); 可写可不写
//jw.close();
}
|
-
setCharacterEncoding,setContentType 推荐 setContentType .
-
可以参考:http://blog.csdn.net/smh821025/article/details/6002666
-
setCharacterEncoding虽然输出的字符是按指定的编码来输出,但浏览器显示是没有强制的使用输出的编码来查看,而是使用浏览器默认的编码查看方式。
-
setContentType 与上面的相反,字符也是按指定的编码输出,且浏览器也按指定的编码查看。
二、getOutputStream与PrintWriter区别
1
2
3
4
|
getOutputStream 字符流输出,支持中文编码。
PrintWriter 二进制流,不支持中文编码,
//new PrintWriter(new OutputStreamWriter(new FileOutputStream("rrrr"), "UTF-8"));
也可以参考:http:
//blog.csdn.net/smh821025/article/details/6002666
|
1
2
3
4
5
6
7
8
9
10
11
|
//3种转向方式。
//1、
return
"page"
;
//以pages目录为根目录,且不用输入.jsp,直接指定名字即可。
//直接在springmvc-servlet.xml的配置
//<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/pages/" p:suffix=".jsp"/>
//2、
return
"forward:/url路径/"
//重新在web容器内部发url路径,让符合情况的下一个控制器接收。(浏览器地址不转向)
//3、
return
"redirect:/page.html"
//发送给浏览器,让其自己转向到指定的地址;会发送302,下面也会讲到。
|
还可以参考:http://hwyjavabrain.iteye.com/blog/1179254
四、有返回值时
1、301、404、302转向
-
404
1
2
3
4
5
6
|
@RequestMapping
(
"/{urldir:[a-z]+}"
)
public
String gotodir(
@PathVariable
(
"urldir"
) String urldir,Map<String, Object> map, HttpServletRequest request,HttpServletResponse response) {
response.sendError(
404
);
return
""
;
//会报错,javax.servlet.ServletException: File "/WEB-INF/pages/.jsp" not found。
}
|
1
2
3
4
5
6
|
@RequestMapping
(
"/{urldir:[a-z]+}"
)
public
String gotodir(
@PathVariable
(
"urldir"
) String urldir,Map<String, Object> map, HttpServletRequest request,HttpServletResponse response) {
response.setStatus(
404
);
//这时正确返回404,且使用web.xml配置的404转向页面。
return
""
;
}
|
-
301
1
2
3
4
5
6
7
8
9
|
@RequestMapping
(
"/{urldir:[a-z]+}"
)
public
String gotodir(
@PathVariable
(
"urldir"
) String urldir,Map<String, Object> map, HttpServletRequest request,HttpServletResponse response) {
String basePath =
"/ttt.html"
;
response.setStatus(
301
);
response.setHeader(
"Location"
, basePath);
//response.sendRedirect("/tttt.html"); //直接报错。
return
""
;
}
//结果为404,未找到,且状态也为404。是因为return "";使用web.xml所设置的捕获转向页面。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@RequestMapping
(
"/{urldir:[a-z]+}"
)
public
String gotodir(
@PathVariable
(
"urldir"
) String urldir,Map<String, Object> map, HttpServletRequest request,HttpServletResponse response)
throws
IOException {
String basePath =
"/ttt.html"
;
response.setStatus(
301
);
response.setHeader(
"Location"
, basePath);
//response.sendRedirect("/tttt.html"); //直接报错。
PrintWriter d =response.getWriter();
//d.print("ttcc"); //输出的无效。
//d.flush();
d.close();
//关闭输出流
return
""
;
//此处不要删除,因为需要返回值。
}
//结果正常301转向,且状态也为301.
|
-
302
1
2
3
4
5
6
|
@RequestMapping
(
"/{urldir:[a-z]+}"
)
public
String gotodir(
@PathVariable
(
"urldir"
) String urldir,Map<String, Object> map, HttpServletRequest request,HttpServletResponse response) {
int
i=
0
;
if
(i==
0
)
return
"redirect:/page.html"
;
//会发302,不利于搜索引擎。
return
""
;
}
|