Spring mvc转向以及设置返回类型

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
三、Spring 控制层转向
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 &quot;/WEB-INF/pages/.jsp&quot; 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  "" ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值