什么時候會進入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><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...
先回答你的第二個問題吧,這里用到了視圖解析器,根據請求路徑解析參數,再去找相應的視圖
@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會根據其類型推斷得出。
希望能幫助你,需要自己思考
關鍵在于下面的設置,注意/與/*的區(qū)別 ,
映射路徑寫成了/*那樣會攔截所有的訪問,JSP頁面就不能直接訪問了
<servlet-mapping>
<!-- 映射路徑,寫成了/*那樣會攔截所有的訪問,JSP頁面就不能直接訪問了 -->
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
EDITED
如果還不是很清楚的話,可以看看tomcatN/conf/web.xml有關jsp設置一段
默認情況下,/路徑由default servlet來映射,主要用來處理靜態(tài)文件如html, js, css ,jpg等, 而jsp的映射方式是*.jsp, 顯然這里*.jsp的優(yōu)先級是大于/的,否則什么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>北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。