SpringMVC简介
SpringMVC初认识
SpringMVC也称Spring Web MVC,是View层的框架。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等。
SpringMVC的优点
- SpringMVC是完全基于mvc构架的,而不像struts等都是变种或者不是完全基于mvc系统的框架。
- 和tapestry一样,它是一个纯正的servlet系统,这也是它和tapestry相比struts所具有的优势。
SpringMVC学习前言
SpringMVC的环境配置
<!--中央调度器-->
<servlet>
<!--servlet-name自行命名-->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指定springMVC配置文件的位置及文件名,param-value中键入自己配置文件的具体位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:xxx.xml</param-value>
</init-param>
<!--值>0,服务器启动时创建当前servlet,越小优先级越高,越先创建-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--与上方servlet中的srvlet-name同名-->
<servlet-name>springmvc</servlet-name>
<!--对于<url-pattern/>,不能写为/*,最好也不要写为/,建议写为*.do 的形式。下面的<url-pattern/>注意事项-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!--注册处理器,注册自己编写的Controller类-->
<bean id="/myController.do" class="handler.MyController"/>
MyController类:
public class MyController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("welcome", "Hello SpringMVC World!");
mv.setViewName("/WEB-INF/welcome.jsp");
return mv;
}
}
welcome.jsp
<body>
${welcome};
</body>
<url-pattern/>注意事项
<url-pattern/>中不要用/*,会拦截动态页面请求,访问jsp页面就会出现异常404。
最好不要用/,因为会拦截静态资源。但是必要情况下,我们需要使用/时,解决静态资源无法访问的方法如下:
- 在web.xml中配置
<servlet-mapping> <!--tomcat.config.webxml定义的,专门处理静态资源--> <servlet-name>default</servlet-name> <!--允许访问.jpg的静态资源--> <url-pattern>*.jpg</url-pattern> </servlet-mapping>
- 在SpringMVC的.xml配置文件中添加mvc标签:
<mvc:default-servlet-handler/>
- 使用<mvc:resources/>。
例:
mvc中resources spring3.0.4版本添加的专门处理静态资源的问题。<mvc:resources location="/img/" mapping="/img/**"/>
路径问题
路径:
- 不以/开头:参考路径:当前访问路径 最后一个/前的路径(资源名称前的路径)。
- 以/开头
- 前台路径:参照路径:服务器的根 http:localhost:8080/
- 后台路径:当前应用的根(项目的根):WebROOT的路径
双test情况:
当我们在注册处理器时,id中添加一个test,如下:
<bean id="/test/myController.do" class="handler.MyController"/>
同时将index界面改为:
<body>
<a href="test/login.do">提交表单信息</a>
</body>
public class MyController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView("/index.jsp");
}
}
当我们点击两次index中的表单提交按钮后,访问的路径会变成这样:
我们发现地址栏中多出了一个test,并且抛出了404异常。
分析原因:
这是因为超链接的herf 属性值为无斜杠的相对路径,所以其参照路径为当前的访问路径。在第一次提交时的“ 当前访问路径” 为localhost/ , 所以相对于它的访问路径即为loclhost/test/login.do。在此访问路径下再次点击超级链接后,此时的“当前访问路径”已经发生变化,变为了localhost/test/。其所访问路径就变为了 localhost/test/test/login.do,而这个资源是没有定义的,所以会报404 错误。
解决方法:
- 使用/开头的请求路径:
<body> <a href="${pageContext.request.ContextPath}/test/login.do">提交表单信息</a> </body>
- basePath(有浏览器兼容问题,不推荐)
<% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPost() + path + "/"; %> <html> <head> <base href="<%=basePath%>"/> <title>index page</title> </head> <body> <a href="test/login.do">提交表单信息</a> </body> </html>