通过Eclipse新建一个名为SpringMVC1的工程,相关Spring MVC的Jar包已经正确导入,然后建立了一个test.jsp文件放到WEB-INF\pages\person\目录下。
在<Servletname>-servlet.xml中加入了如下配置:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  <property name="prefix" value="/WEB-INF/pages/"/>
  <property name="suffix" value=".jsp"/>
</bean>部署到Tomcat中启动。
问题1:在浏览器中输入地址:
http://localhost:8080/SpringMVC1/person/test,显示错误“The server encountered an internal error () that prevented it from fulfilling this request.”,请问各位高手,难道不能直接访问到该JSP吗?我想是不是一定要通过控制器转发才行,于是我新建一个index.html页面,内容如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SpringMVC1 Test</title>
</head>
<body>
Hello,SpringMVC!
</body>
<form action="/SpringMVC1/personmg/testjsp">
test jsp view.
<input type=submit value="Submit">
</form>

</html>然后新建一个Java类如下:
@Controller
@RequestMapping("/personmg")
public class PersonService{
@RequestMapping("/testjsp")
public ModelAndView testpage()
{
//return "redirect:/person/test";
return new ModelAndView("/person/test");
//return new ModelAndView(new RedirectView("/person/test"));
}
}
重新部署后发现
问题2:
使用return new ModelAndView("/person/test");语句时在index.html中点Submit按钮能正确显示test.jsp文件中得内容。如果使用return new ModelAndView(new RedirectView("/person/test"));或return "redirect:/person/test";语句则点Submit按钮后系统提示“The requested resource (/person/test) is not available.”。很迷茫,Spring的文档中明明说明是可以直接在URL中使用视图地址也可以使用redirect重定向的,请各位高手指正,谢谢!
redirectspringmvcspringmvc

解决方案 »

  1.   

    <<Spring的文档中明明说明是可以直接在URL中使用视图地址实现WEB-INF的安全性,限制浏览器直接访问该文件夹下信息是web服务器的职能,貌似和spring无关,楼主看到的这句话出处是哪呢?http://tomcat.apache.org/tomcat-5.5-doc/security-manager-howto.html
      

  2.   

    我说得视图地址是指经过SpringMVC视图解析器处理过的地址。并不是直接访问Web-INF下的JSP文件。
      

  3.   

    通过这个地址访问
    http://localhost:8080/SpringMVC1/person/test
    会首先经过SpringMVC视图解析器的处理?
      

  4.   


    看了很多网上的例子,里面的意思都是可以这样做,所以觉得很纳闷,而且如果不能这样的话,那么是不是每一个视图都一定要通过控制器进行转发处理?这样不是特别麻烦吗,Spring MVC有没有对此提出解决方案呢?此外,不能使用return new ModelAndView(new RedirectView("/person/test"));也让我很郁闷,难道不能对视图地址重定向处理吗?如果要重定向到一个地址该怎么操作呢?
      

  5.   

    唉,感觉CSDN也不象以前那么热闹了.
      

  6.   

    我看到这里是这样用的,不知道有没有关系@Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request,
    HttpServletResponse response) throws Exception {
     
    return new ModelAndView("DummyRedirect");
     
    } http://www.mkyong.com/spring-mvc/spring-mvc-redirectview-example/还有你说
    <<Spring的文档中明明说明是可以直接在URL中使用视图地址也可以使用redirect重定向的
    给一下出处?
      

  7.   

    问题不是在于SpringMVC而是你将JSP文件放在WEB-INF目录下. 该目录下本来应该是用来存放服务器段程序以及相应的一些配置文件的. 因为安全问题考虑所以不允许客户端直接访问该目录下的文件.(如果可以的话那么客户端上就能下载你服务器上的web.xml之类的配置了.) 而redirect是服务器端返回以后, 通知客户端申请访问你指定的一个地址. 相当于客户端重新发起了一个请求. 所以你这种方式是没法实现的.
    如果要修改程序的话需要你将jsp文件放在WEBROOT目录下.
      

  8.   

    1. WEB-INF下的文件出于安全考虑,不能直接访问;
    2.return new ModelAndView();里面直接写路径就可以了;
      

  9.   

    SPRING MVC 在处理Redirect时
    不会给你加前缀后后缀
    所以你的 "/ddd/dd",它是不认识的
    要你自己写全路径“/xx/xxx.jsp”
      

  10.   


    但是这样做只是相当于forward,不能redirect
      

  11.   


    我是想所有的jsp文件都放到Web-INF目录下面,结合Spring Security来控制JSP文件的访问权限。
    如果不放到WEB-INF目录下面,安全性就没有保障了。
      

  12.   

    要实现这种功能的话你只能另外写一个Servlet或者Action. 接到以jsp为结尾的请求的时候自动forward至相应jsp文件.
    比如说定一个Action, 只监控/*.jsp, 收到请求以后代码new ModelAndView返回.
      

  13.   


    如果是forward的话那我就不会来这里求助了,我是想要进行redirect处理。
    如果是forward,此时用户刷新操作,又会发生一次提交操作,如果redirect到一个新页面就不存在这种问题了。
      

  14.   

    你想redirect当让要再有个控制类啊,redirect 不就是又有新的请求吗,所以要有新的控制类接受才可以吧,或者新方法
      

  15.   

    很好,我把代码写成下面这样后问题解决.
    但是我还是有一个问题,如果每次redirect都要写一个控制类不是非常麻烦吗?有没有一个通用的控制器类能解决类似redirect问题?谢谢!
    @RequestMapping(value="/test")
    public ModelAndView test(HttpServletRequest request,HttpServletResponse response)
    {
                    //下面redirect是到一个控制器地址,而不是一个视图地址;
    return new ModelAndView("redirect:/person/test1");
    }
    @RequestMapping(value="/test1")
    public ModelAndView test1(HttpServletRequest request,HttpServletResponse response)
    {
                    //这里返回一个视图地址,不加redirect.
    return new ModelAndView("/person/testpage");
    }
      

  16.   

    @RequestMapping(value="{id}", method=RequestMethod.GET)
    public String getView(@PathVariable Long id, Model model) {
    return new ModelAndView("/person/id");
    }
    {id}是url中的一部分  这样就可以使用id这个变量了,你可是试试应该是好用的,说实话你说好用我很高兴,我并没有实际应用过spring mvc 就昨天看了几个例子,希望对你有帮助
      

  17.   


    呵呵,看来你对MVC编程了解的很深.我对return new ModelAndView("redirect:/person/test1")语句中如果加了"redirect:"就不行很不解.多谢你了.
      

  18.   

    一样的问题,我的return "redirect:/user/success"也不能找到相应的页面
      

  19.   

    通过这个地址访问
    http://localhost:8080/SpringMVC1/person/test
    会首先经过SpringMVC视图解析器的处理?感觉原理都没有搞清楚!