SpringMVC 基础(一)
SpringMVC 基础(一)
SpringMVC 基础笔记系列
SpringMVC框架
作用
SpringMVC框架解决了V与C的交互问题。
原生的Servlet
就是控制器,使用Servlet主要存在的问题是实例太多,配置麻烦,管理难度大等一系列的问题。例如项目中有用户注册功能,则可能需要开发UserRegisterServlet
,如果还有登录功能,则可能需要开发UserLoginServlet
,几乎是每个功能需要有1个对应的Servlet
,如果一个项目中有200个不同的功能,则需要200个Servlet
,在更大的系统中,Servlet
的数量就非常多,在实际运行时,在内存中的Servlet
对象就会占据大量的内存空间!由于Servlet
的数量很多,进而导致配置文件的配置信息会非常多,配置信息多了以后,就会引发管理难度大的问题。
SpringMVC中的核心组件
DispatcherServlet
:前端控制器,用于接收所有请求,并负责分发;HandlerMapping
:根据请求路径映射控制器或控制器的方法,确定请求路径与控制器或控制器中的方法的对应关系;Controller
:实际处理请求的组件;ModelAndView
:控制器的返回结果,包括处理完成后的数据,及最终应该响应给客户端的视图名称;ViewResolver
:根据视图名称得到具体的视图组件。
具体的执行流程图:
SpringMVC HelloWorld
目标
在浏览器中通过http://localhost:8080/项目名称/hello.do
可以访问某个JSP显示的页面,页面中显示**Hello, SpringMVC!!!**字样。
创建
创建Maven Project,Artifact Id为cn.tedu.spring
,Artifact Id为SPRINGMVC01
,Packaing必须选择war
。
创建完成后,首先生成web.xml文件。
然后,在pom.xml中添加spring-webmvc
的依赖。
然后,将Spring的配置文件复制到src/main/resources下。
另外,还需要添加Tomcat运行环境。
配置DispatcherServlet
打开web.xml,在配置文件中对DispatcherServlet
进行配置,使之可以处理所有以.do
结尾的请求:
<node>
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</node>
SpringMVC框架是基于Spring框架的,后续开发的组件也应该随着项目启动就完成初始化,例如自定义的控制器类等等,也就意味着当项目启动时,就应该加载Spring的配置文件(spring.xml)。
在DispatcherServlet
的父类FrameworkServlet
中定义了名为contextConfigLocation
的属性,当DispatcherServlet
初始化时,会自动读取该属性的值,而该属性的值应该是配置文件的路径,则DispatcherServlet
就会自动加载配置文件!
所以,还应该对DispatcherSerlvet
的contextConfigLocation
属性进行配置,值是Spring的配置文件,并保证DispatcherServlet
是默认启动的:
<node>
<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:spring.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>
</node>
完成以上配置后,如果需要检测配置是否成功,可以在Spring的配置文件中添加组件扫描:
<context:component-scan base-package="cn.tedu.spring"/>
然后,创建cn.tedu.spring.User
类,为该类添加注解,并自定义构造方法:
@Component
public class User {
public User() {
System.out.println("初始化User对象。");
}
}
当把项目部署到Tomcat时,Tomcat启动就会初始化DispatcherServlet
,由于配置了初始化参数contextConfigLocation
,就会加载Spring的配置文件,在配置文件中执行组件扫描,扫描到User
时,由于User
类添加了注解,Spring就会创建User
类的对象,也就是执行了无参数的构造方法,则会执行以上代码中的输出语句!总的来说,启动Tomcat就可以看到以上输出语句!
通过控制器接收请求
自定义控制器类cn.tedu.spring.HelloController
,在类之前添加@Controller
注解:
@Controller
public class HelloController {
}
然后,在类中添加方法以处理请求,关于方法的设计:
应该使用
public
权限;暂时使用
String
作用方法的返回值类型;方法的名称可以自由定义;
方法可以没有参数。
则可以添加:
public String showHello() {
}
然后,在方法之前使用@RequestMapping("请求路径")
来配置请求路径:
@RequestMapping("hello.do")
public String showHello() {
}
则实现了请求路径与处理请求的方法的映射关系,即:当请求hello.do
时,就会自动调用showHello()
方法!
可以在以上方法中输出日志,以观察运行效率,暂时不关心返回值,所以,测试运行时页面将提示404错误,暂时是正常的:
@RequestMapping("hello.do")
public String showHello() {
System.out.println("HelloController.showHello()");
return null;
}
最后,重新启动项目,通过http://localhost:8080/SPRINGMVC01/hello.do
进行访问,在浏览器中会提示404,并在Eclipse的控制台中可以看到以上输出语句的内容!
显示页面
首先,在webapp/WEB-INF/hello.jsp页面,用于显示。
在控制器处理请求的方法中,返回的String
值表示“视图名称”,将根据视图解析器ViewResolver
进行解析,得到以上创建的JSP文件。
实际使用的InternalResourceViewResolver
的工作原理就是以webapp作为根路径,“前缀 + 控制器返回的字符串 + 后缀”得到文件位,所以,可以配置为:
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
然后,控制器的方法必须返回"hello"
,这样,前缀与返回值与后缀拼接起来,就可以得到/WEB-INF/hello.jsp
。
最后,在浏览器再次访问,可以看到JSP页面设计的内容。