1、视频的下载地址是
下载地址:百度云盘 链接:http://pan.baidu.com/s/1ge58XW3 密码:yd5j
http://www.java1234.com/a/javaziliao/javaweb/2017/0920/8975.html
第一个springmvc入门的helloword
第一步新建立一个web project
添加对应的lib包
这里需要注意的是我使用的是myeclipse 2015不支持MyEclipse2015不支持spring-web-4.2.4.RELEASE.jar会导致在tomcat部署应用的时候,导致程序无法部署spring-webmvc-3.1.1.RELEASE.jar.
这里使用的是较低的版本
第二步:
在src目录下建立springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd"> <!-- 配置control --> <bean id="/hello.do" class="com.weiyuan.test.MyController"/> </beans>
接下来建立control文件
package com.weiyuan.test; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class MyController implements Controller{ /* * ModelAndView 返回值是数据和视图 * 在web-inf下的资源是外部浏览器是不能直接访问的,web-root下的资源浏览器是能够直接访问的 * 所以web-inf下的资源是不能通过浏览器直接重定向访问的 * */ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse reponse) throws Exception { // TODO Auto-generated method stub ModelAndView mv = new ModelAndView(); mv.addObject("message","welcome to first springmvc helloword"); mv.setViewName("/WEB-INF/jsp/welcome.jsp"); System.out.println("handleRequest is called"); return mv; } }
然后在web-inf目录下建立文件夹jsp在jsp目录下建立welcome.jsp文件,将在MyController 中设置的信息mv.addObject("message","welcome to first springmvc helloword");显示出来
welcome.jsp文件内容如下所示:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> ${message} </body> </html>
接下来在web.xml中配置springmvc的中央处理器
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SpringMVc-01</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置中央调度器 --> <!-- 中央控制器,这里千万不能配置成 --> <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:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
这样整个项目的配置就成功可
在浏览器上输入
我们想tomcat一运行的时候就创建我们的org.springframework.web.servlet.DispatcherServlet,我们可以在web.xml中进行配置
添加下面的配置 <load-on-startup>1</load-on-startup>
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SpringMVc-01</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置中央调度器 --> <!-- 中央控制器,这里千万不能配置成 --> <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:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
在servlet的配置当中,<load-on-startup>1</load-on-startup>的含义是:
标记容器是否在启动的时候就加载这个servlet。
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。
如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。
配置load-on-startup后,servlet在startup后立即加载,但只是调用servlet的init()方法,用以初始化该servlet相关的资源。初始化成功后,该servlet可响应web请求;如未配置load-on-startup,容器一般在第一次响应web请求时,会先检测该servlet是否初始化,如未初始化,则调用servlet的init()先初始化,初始化成功后,再响应请求。
PS:一般我们在开发web应用时,都会配置这个参数,有两个好处:1、如果初始化过程失败,则容器会提示启动失败,此时我们能够提前知道相关错误;2、配置该参数相当于将初始化servlet的工作转移到容器启动过程,使得容器只要启动成功后,就可立即响应web请求。
注意点2:使用视图解析器
我们在springmvc中我们注册使用视图解析器
<!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置从项目根目录到指定目录一端路径 ,建议指定浅一点的目录--> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- 文件的后缀名 --> <property name="suffix" value=".jsp"></property> </bean>
prefix表示前缀的意思,指定的第一级目录的位置是web-inf下的jsp目录
suffix表示后缀,表示文件的后缀是.jsp
用视图解析器用于表示文件的拼接
springmvc.xml文件的内容如下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd"> <!-- 配置control --> <bean id="/hello.do" class="com.weiyuan.test.MyController"/> <!-- 注册视图解析器 --> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置从项目根目录到指定目录一端路径 ,建议指定浅一点的目录--> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- 文件的后缀名 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
然后control的代码也可以做出下面的修改为
package com.weiyuan.test; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class MyController implements Controller{ /* * ModelAndView 返回值是数据和视图 * 在web-inf下的资源是外部浏览器是不能直接访问的,web-root下的资源浏览器是能够直接访问的 * 所以web-inf下的资源是不能通过浏览器直接重定向访问的 * */ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse reponse) throws Exception { // TODO Auto-generated method stub ModelAndView mv = new ModelAndView(); mv.addObject("message","welcome to first springmvc helloword"); //mv.setViewName("/WEB-INF/jsp/welcome.jsp"); //使用视图解析器之后,视图解析器会帮助我们进行拼接,这里直接写出welcome就可以了 mv.setViewName("welcome"); System.out.println("handleRequest is called"); return mv; } }
注意点三:
常见的url-pattern配置有以下三种:
第一种:
'*.xxx', 以指定后缀结尾的请求都交由DispatcherServlet处理
第二种:
'/' 将会覆盖容器的default servlet, 凡是在web.xml文件中找不到匹配的URL,它们的访问请求都将交给该Servlet处理(静态资源也将会拦截). 所以web.xml没有配置其他特殊路径的servlet, 基本上所有的请求都交由DispatcherServlet处理.
关于什么是default servlet, 可以参考我之前的博文.
第三种:
'/*' 错误的配置,会拦截*.jsp, *.jspx的请求, 使用这种配置最终要转发到一个JSP页面,仍然会由DispatcherServlet, 解析jsp地址, 不能根据jsp页面找到handler, 会报错
对于第一种扩展匹配, 是最简单的. 也是使用最简单的了.但是现在如此流行restful风格的URL, 这种带小尾巴的URL, 还是有点low的.
第二种配置使用/, 通过该配置是可以实现rustful风格的URL的.
<url-pattern>*.do</url-pattern>,不能写成/*.如果写成/*就是对应浏览器所有的请求都交给中央处理器去请求
例如在浏览器中输入访问的是默认的index.jsp文化
访问的是index.jsp.如果上面把配置修改成/*
访问的时候就会出现错误,找不到对应的处理文件。因为中央处理器没有定义对应的control对请求进行处理
配置成/的时候,会拦截静态资源文件
在浏览器中输入http://localhost:8080/SpringMVc-01/访问的是index.jsp文件,配置成/是可以访问jsp文件的
在jsp文件中我们去访问一张图片,这个时候如果配置成/,是无法访问到这张图片的,如何解决了
我们来看下代码
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br> <img alt="pic" src="images/1.png"> </body> </html>
对应的web.xml
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SpringMVc-01</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置中央调度器 --> <!-- 中央控制器,这里千万不能配置成 --> <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:springmvc.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> </web-app>
在浏览器中输入
这个时候是无法访问到对应图片的
如何解决了,解决办法有下面的三种形式
第一种方法,在web.xml中进行配置
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SpringMVc-01</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 解决url-pattern是/的问题 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <!-- 配置中央调度器 --> <!-- 中央控制器,这里千万不能配置成 --> <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:springmvc.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> </web-app>
第二种方法:静态资源无法访问问题-使用MVC的default-servlet-handler解决
在springmvc.xml中添加
<mvc:default-servlet-handler/>
但是需要因为mvc的约束
xmlns:mvc="http://www.springframework.org/schema/mvc"
springmvc.xml的内容如下所示
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd"> <mvc:default-servlet-handler/> <!-- 配置control --> <bean id="/hello.do" class="com.weiyuan.test.MyController"/> <!-- 注册视图解析器 --> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置从项目根目录到指定目录一端路径 ,建议指定浅一点的目录--> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- 文件的后缀名 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
第三种方法:静态资源无法访问问题-使用MVC的resources解决
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd"> <mvc:resources location="/images/" mapping="/images/**"></mvc:resources> <!-- 配置control --> <bean id="/hello.do" class="com.weiyuan.test.MyController"/> <!-- 注册视图解析器 --> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置从项目根目录到指定目录一端路径 ,建议指定浅一点的目录--> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- 文件的后缀名 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
北京动力节点-SpringMVC4-016-请求路径问题-什么是绝对路径.avi
绝对路径就是一个具体的地址,马上可以定位到四川省成都市高新区xx小区xx栋xx单元
相当路径:需要选取一个具体的参照物,例如人民公园门口,北京有人民公园,上海有人民公园,需要有一个参照路径是上海还是北京
参照路径和相当路径一起组合构成一个绝对路径
浏览器中输入的http开头的都是绝对路径
北京动力节点-SpringMVC4-017-请求路径问题-相对路径的参照路径.avi
只要不已http开头的都可以认为是相对路径
相对路径中带有反斜杠的前台路径:jsp中对应的路径,对应的参照位置是tomcat所在路径
相对路径中带有反斜杠的后台路径:java代码或者xml等对应的路径,对应的是tomcat中对应的webapp应用的路径
北京动力节点-SpringMVC4-018-请求路径问题-举例.avi
案例一:
北京动力节点-SpringMVC4-019-请求路径问题-举例2.avi
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br> <img alt="pic" src="images/1.png"> </body> </html>
这里要访问images目录下的1.png文件,在jsp页面中如果写成/images/1.png,带有斜杠对应的参照路径就是当前的tomcat服务器,资源是访问不到的,不写斜杠对应的参照路径就是当前的应用