当然, 今时今日使用maven 和 springboot 去创建1个java web project会更加方便。
但是手动搭建1个会加深我对springmvc的理解。
Step1 打开eclipse 创建1个新的Dynamic web project
Step2 往project内的 WEB-INF/lib folder导入下列spring 的jar包
大部分都能在 .m2 里的repository folder找到, 如果没有可以利用别的maven project下载。
commons-logging-1.1.1.jar
spring-aop-4.1.4.RELEASE.jar
spring-aspects-4.1.4.RELEASE.jar
spring-beans-4.1.4.RELEASE.jar
spring-context-4.1.4.RELEASE.jar
spring-core-4.1.4.RELEASE.jar
spring-expression-4.1.4.RELEASE.jar
spring-tx-4.1.4.RELEASE.jar
spring-web-4.1.4.RELEASE.jar
spring-webmvc-4.1.4.RELEASE.jar
Step3 初步编写web.xml 文件
在WEB-INF 文件夹创建1个web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sum.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- auto start -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Step4 启动项目(with eclipse defined tomcat runtime)
Tomcat 会报错, 找不到 WEB-INF 下的springmvc-servlet.xml
说明spring DispatcherServlet会默认在那里寻找servlet 配置文件。
Step5 修改spring 配置文件位置
在上面的web.xml 中, 为servlet springmvc 添加1个参数contextConfigLocation, 值我们写上classpath:springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sum.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- auto start -->
<load-on-startup>1</load-on-startup>
<!-- modify spring configuration file path and file name -->
<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>/</url-pattern>
</servlet-mapping>
</web-app>
在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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
</beans>
重新启动项目, tomcat 的错误就消失了
到这步为止, 我们已经初步实现了springmvc 四大组件中的中央调度器 DispatcherServlet.
下面我们来实现第二个组件Handler Mapping
Step6 添加1个HandlerMapping 和1个Contoller类
在src目录下添加1个DemoController 类:
package com.home.controller;
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 DemoController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req,HttpServletResponse res) throws Exception {
// TODO Auto-generated method stub
System.out.println("executed Demo controller!");
return null;
}
}
在springmvc.xml中 导入 上面直接换个bean 以及新建1个SimpleHandlerMapping 的bean
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
<bean id ="democontroller1" class="com.home.controller.DemoController"></bean>
<bean id = "" class= "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<!-- key means the logic name of controller -->
<entry key="demo" value-ref="democontroller1"></entry>
</map>
</property>
</bean>
</beans>
启动项目,在浏览器输入 http://localhost:8080/springmvc_manual/demo
可以见到DemoController被成功调用并执行
到这里为止, 我们实现了springmvc 中的第二个组件HandlerMapping.
还有另两个组件 HandlerAdapter 和ViewResovler , 我们并没有配入配置文件中。
其实spring 4 已经帮我们配了默认值, 但是这次我仍然想把他们也配置了。
Step7 添加1个HandlerAdapter
在springmvc.xml中添加
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
重启项目, 刷新页面, DemoController仍然可以被调用
Step8 令DemoController 返回1个jsp页面
在WebContent下建立1个jsp文件夹, 里面创建1个demo1.jsp
修改DemoController, 另它return new ModelAndView(jsp/demo1.jsp)
package com.home.controller;
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 DemoController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req,HttpServletResponse res) throws Exception {
// TODO Auto-generated method stub
System.out.println("executed Demo controller!");
return new ModelAndView("jsp/demo1.jsp");
}
}
重启项目, 效果:
其实这里Spring也帮我们使用了默认的ViewSolver, 同样地,下面我也会进行手动配置。
Step8 添加ViewResolver
在springmvc.xml中, 添加
<!-- InternalResoucesViewReslover -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"/>
</bean>
prefix 和 suffix表示会在ModelAndView的值前后加上的额为值。
上面的写法就代表spring会在/WEB-INF/jsp 里寻找jsp文件
当然, 要在WEB-INF 创建jsp文件和1个demo1.jsp文件, 里面的内容改改
修改DemoController ModelAndView的值
只写demo1
重启项目, 刷新: