为什么有的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>

回答:

关键在于下面的设置,注意//*的区别 ,
映射路径写成了/*那样会拦截所有的访问,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,有拦截器拦截

以上是 为什么有的jsp页面能跳转到另外的jsp页面,有的jsp却进入后台controller呢? 的全部内容, 来源链接: utcz.com/p/181217.html

回到顶部