为什么有的jsp页面能跳转到另外的jsp页面,有的jsp却进入后台controller呢?

什么时候会进入controller呢,是否跟web.xml的配置有关?
如何的超链接是直接进入对应的jsp页面的,为啥不进入controller?
图片描述

<div class="float_right">
                您的位置:<a href="/ehouse/jsp/index.jsp">首页</a> ><a href="#">城市运营</a>
            </div>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:config/spring-*.xml</param-value>
  </context-param>
  <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:config/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
阅读 8.6k
5 个回答

关键在于下面的设置,注意//*的区别 ,
映射路径写成了/*那样会拦截所有的访问,JSP页面就不能直接访问了

<servlet-mapping>
        <!-- 映射路径,写成了/*那样会拦截所有的访问,JSP页面就不能直接访问了 -->
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

EDITED

如果还不是很清楚的话,可以看看tomcatN/conf/web.xml有关jsp设置一段

图片描述

默认情况下,/路径由default servlet来映射,主要用来处理静态文件如html, js, css ,jpg等, 而jsp的映射方式是*.jsp, 显然这里*.jsp的优先级是大于/的,否则什么jsp都无法访问了。

springMVC相当于是重载了default,所以行为也与default的映射关系是一致的。

大部分的JSP为了安全起见都是放在WEB-INF文件目录下,从而避免外部直接通过URL进行访问。
所以通过Controller来实现JSP之间的跳转可以说是一个比较好的实践。

在配置文件中,跟URL跳转有点关系的是这一部分代码:

 <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

这里你使用SpringMVC作为控制器框架,并且将该域名下所有的路径都指向该控制器。所以按理说你的所有跳转都会从控制器走而不会去访问专门的jsp文件。

这里你需要更改是你的HTML中href属性,将其指向某个控制器匹配的路径。这里给一个示范:

假设你有一个SpringMVC的控制器,代码如下:

@Controller
@RequestMapping("/ehouse")
public class DemoController{

    //该控制器匹配得路径为/ehouse/index
    @RequestMapping("/index")
    public String index(){
        //这里可以配置一下SpringMVC的prefix和suffix
        //返回的是对应的jsp页面的路径
        return "/jsp/index.jsp";
    }
}

然后将HTML改成这样:

<div class="float_right">
   您的位置:
    <a href="/ehouse/index">首页</a> ><a href="#">城市运营</a>
</div>

先回答你的第二个问题吧,这里用到了视图解析器,根据请求路径解析参数,再去找相应的视图

    @Bean
    public ViewResolver viewResolver () {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        //配置JSP视图解析器
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

还有一点,你映射了所有的请求路径,只要访问“/”它就会被拦截

public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected String[] getServletMappings() {             //将DispatcherServlet映射到“/”
        return new String[]{"/"};
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?> [] {RootConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?> [] { WebConfig.class};
    }
}

这里是你所要请求的映射路径路径,

@Controller
public class HomeController {
    @RequestMapping(value = "/",method = RequestMethod.GET)           //处理对“/”的Get请求
    public String home() {
        return "home";                                                //视图名为home
    }
}

根据返回值进行选择,

还有一种没有返回值,

@RequestMapping(method = RequestMethod.GET)
public List<String> spittles() {
  return spittleRepository.findSpittles(Long.MAX_VALUE,20));
}

当处理器方法像这样返回对象或集合时,这个值会放到模型中,模型的key会根据其类型推断得出。
希望能帮助你,需要自己思考

<url-pattern>/</url-pattern>:
会匹配到/springmvc这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url。

<url-pattern>/*</url-pattern>:
会匹配所有的url:路径型的和后缀型的url(包括/springmvc,.jsp,.js和*.html等)。

It will accept http://host:port/context/hello, but reject http://host:port/context/hello.jsp

下面是关于这个问题在stack overflow上的解释:
原文链接:http://stackoverflow.com/ques...

一个指向的是后台地址,一个跳向的是指定的页面。跳向后台你可以看看web.xml,有拦截器拦截

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题