一、初识SpringMVC
1.传统的MVC模式:
- M-Model(模型):模型(Model)的职责是负责业务逻辑。包含两层:业务数据和业务处理逻辑。比如实体类、DAO、Service都属于模型层。
- V-View(视图):视图(View)的职责是负责显示界面和用户交互(收集用户信息)。属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
- C-Controller(控制器):控制器是模型层M和视图层V之间的桥梁,用于控制流程。比如:在Servlet项目中的单一控制器Servlet。
2.Spring MVC模式
- Spring Web MVC是Spring框架一个非常重要的能能模块。实现了MVC结构,便于简单、快速开发MVC结构的Web程序。Spring Web MVC提供的API封装了Web开发中常用的功能,简化了Web过程。Spring Web MVC提供了M、V和C相关的主要实现组件,具体如下:
- DispatcherServlet(控制器,请求入口)
- HandlerMapping(控制器,请求派发)
- Controller(控制器,请求处理流程)
- ModelAndView(模型,封装业务处理结果和视图)
- ViewResolver(视图,视图显示处理器)
- Spring web MVC 主要处理流程:
- 浏览器向Spring发出请求,请求交给前端控制器DispatcherServlet处理;
- 控制器通过HandlerMapping找到相应的Controller组件处理请求;
- 执行Controller组件约定方法处理请求,在约定方法调用模型组件完成业务处理。约定方法可以返回一个ModelAndView对象,封装了处理结果数据和视图名称信息。
- 控制器接收ModelAndView之后,调用ViewResolver组件,定位View(JSP)并传递数据信息,生成响应界面。
项目一SpringMVC:
项目框架:
(1)配置web.xml文件:
(2)创建HelloController类:
@Component
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
// 测试输出
System.out.println("HelloController.handleRequest()");
// 准备返回值
ModelAndView result = new ModelAndView();
// 设置响应的view的名称
result.setViewName("index");
// 返回
return result;
}
}
(3)创建applicationContext.xml
<!-- 组件扫描 指定的包 -->
<context:component-scan base-package="tedu.spring.controller"></context:component-scan>
<!--配置handlerMapping ,不需要指定id属性 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- key表示请求路径 ;文本节点配置Controller的id -->
<prop key="/hello.do">helloController</prop>
</props>
</property>
</bean>
<!-- 配置viewResolver,不需要指定id属性 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀,即view文件在项目中相对于webapp的路径 -->
<property name="prefix" value="/WEB-INF/"></property>
<!-- 后缀,即文件的扩展名 -->
<property name="suffix" value=".jsp"></property>
</bean>
(4) 完善web.xml文件,使启动时加载applicationContext.xml
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置加载spring的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.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>
(5)创建index.jsp:改“UTF-8”,随便在body里面写什么;
(6)访问项目:http://localhost:8080/SpringMVC/hello.do
总结:
- 导入相关的包
- 在web.xml中配置DispatcherServlet前端组件
- 创建Controller的实现类:controller组件负责执行具体的业务处理,可以调用DAO等组件,需要Controller接口及约定方法。Controller组件约定的handleRequest方法执行后返回一个ModelAndView对象,该对象封装模型数据和视图信息。
- 在applicationContext.xml文件中配置Controller的实现类,便于实例化
- 在applicationContext.xml文件中配置SimpleUrlHandlerMapping组件:通过HandlerMapping组件,DispatcherServlet控制器可以将客户HTTP请求映射到Controller组件上
- 在applicationContext.xml文件中配置InternalResourceViewResolver视图解析器,负责处理返回客户响应视图。
项目二:基于注解的SpringMVC1
1.项目框架:
2.创建RegisterController类(用于注册控制)
@Controller
@RequestMapping("/user")
public class RegisterController {
// http://localhost:8080/SpringMVC1/user/register.do
@RequestMapping("register.do")
public ModelAndView handleRequest() {
System.out.println("RegisterController.handleRequest()");
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
return mav;
}
// http://localhost:8080/SpringMVC1/user/login.do
@RequestMapping("/login.do")
public String login() {
return "login";
}
}
3.创建applicationContext.xml文件
4.创建index.jsp和login.jsp:
5.配置web.xml文件:
6.访问:http://lcoalhost:8080/SpringMVC1/user/register.do和http://lcoalhost:8080/SpringMVC1/user/login.do
小结:
- 在Spring MVC设计的WEB应用中,可以使用 @Controller 对控制器类(原本实现Controller的类)进行注解!
- 一旦使用了 @Controller 注解,控制器类可以不必实现Controller接口!
- 注意:@Controller注解不可以单独使用,必须匹配@RequestMapping一起使用!
- @RequestMapping用于对处理器类中的方法进行注解,并且需要指定所处理的请求的路径。
- 使用了@Controller和@RequestMapping的组合之后,原本Spring的XML配置文件中不要再配置HandlerMapping!如果仍然存在HandlerMapping的配置,并且没有当前请求与处理器的映射关系的配置,反而会报错!总之,不要配置HandlerMapping!!!
- @RequestMapping不仅仅可以对方法进行注解,也可以用于对处理器类进行注解! 但是,对处理器类进行注解不可以取代对方法的注解,两者应该同时使用!用于处理请求路径有多个层级的需求。
- 当使用@RequestMapping同时注解处理器类和方法时,两处所写的路径对于组合时的路径分隔符是没有要求的!例如以下组合都是正确的;
/user /register.do 【推荐】 /user register.do /user/ /register.do user /register.do user register.do
- @RequestMapping用于配置处理器类和请求路径的映射,必须对处理器类中的方法进行注解,如果请求路径有多层级,可以添加对处理器类的注解,则在对方法的注解中可以少写一些路径。
- 当使用了以上注解后,同一个Controller中可以处理多种不同的请求,并且,类中处理请求的方法是可以自定义的!方法的自定义表现为:
- - 方法名称没有要求
- - 方法的参数没有要求
- - 方法不要声明抛出异常
- - 方法必须是public的
- - **方法的返回值必须是ModelAndView或者String的**
三(一)、基于注解的SpringMVC的项目搭建
1.练习要求:
- 项目名称:DAY04-03-SpringMVC-Sample
- 请求路径:http://SERVER:PORT/PROJECT/user/register.do
- 处理器类:cn.tedu.spring.controller.UserController
- 处理方法:public String showRegisterForm() { }
- JSP页面:user_register_form.jsp
目录结构:
创建UserController类:
@Component
@RequestMapping("/user")
public class UserController {
@RequestMapping("/register.do")
public String showRegisterForm() {
return "user_register_form";
}
}
创建applicationContext类:
配置web.xml文件:
创建user_register_form.jsp:
访问:http://localhost:8080/SpringMVC2/user/register.do
三(二)、基于注解的Spring MVC 续—获取请求参数
创建User类:
(此处省略set/get方法)
创建UserController类:
@Component
@RequestMapping("/user")
public class UserController {
@RequestMapping("/register.do")
public String showRegisterForm() {
return "user_register_form";
}
@RequestMapping("/handlerRegister")
public String handlerRegister(HttpServletRequest request) {
System.out.println("UserController.handlerRegister()");
String username = request.getParameter("username");
System.out.println("username" + username);
return null;
}
}
完善jsp页面:
<body>
<center>
<div id="content">
<h2>用户注册</h2>
<form
action="${pageContext.request.contextPath}/user/handlerRegister.do"
method="post">
<div id="register-form">
<div class="item">
<b>用户名</b>
<p>
<input type="text" class="inp" name="username">
</p>
</div>
<div class="item">
<b>密码</b>
<p>
<input type="password" class="inp" name="password">
</p>
</div>
<div class="item">
<b>月薪</b>
<p>
<input type="text" class="inp" name="salary">
</p>
</div>
<div class="item">
<input type="submit" class="button" name="提交">
</div>
</div>
</form>
</div>
</center>
</body>
访问:http://localhost:8080/SpringMVC2/user/register.do
小结——通过HttpRequestServlet获取请求参数
- 添加HttpServletRequest参数时,不一定需要添加HttpServletResponse参数。
- 当添加参数后,在方法中,调用参数的getParameter(String)方法即可获取请求参数的值,做法同 使用Servlet编程。
未完待续