MVC设计模式
Model(模型)
1.表示应用程序核心(比如数据库记录列表)。
2.是应用程序中用于处理应用程序数据逻辑的部分。
3.通常模型对象负责在数据库中存取数据。
View(视图)
1.显示数据(数据库记录)。
2.是应用程序中处理数据显示的部分。
3.通常视图是依据模型数据创建的。
Controller(控制器)
1.处理输入(写入数据库记录)。
2.是应用程序中处理用户交互的部分。
3.通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
SpringMVC的优势
- SpringMVC是一款很轻量级的框架,要使用它的组件我们往往只需要定义一些最简单的Java类,然后添加某些注解就可以了
- SpringMVC的参数注入只直接注入到方法中,可以很好的做到不同请求间数据的隔离,而Struts2是注入到类实例变量上,不同的请求可能会覆盖参数。
- SpringMVC可以很轻易的和Spring整合,而Struts需要做比较复杂的配置。
SpringMVC简单使用
-
添加依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.0.RELEASE</version> </dependency>
-
在web.xml中配置DispatcherServlet
<servlet> <servlet-name>aa</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定SpringMVC 配置文件位置,DispatcherServlet初始化时会初始化Spring上下文(WebApplicationContext) --> <!-- 默认配置文件寻找位置:/WEB-INF/{servlet-name}-servlet.xml,如果名字符合默认寻找规则,可以不指定配置文件路径 --> <!--<init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/aa-servlet.xml</param-value> </init-param>--> <!-- 配置容器启动时初始化DispatcherServlet --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>aa</servlet-name> <!-- 映射路径配置成/,代表当前Servlet是一个默认Servlet,就是当其他Servlet都无法处理请求时,由默认Servlet出马 --> <url-pattern>/</url-pattern> <!-- <url-pattern>/*</url-pattern>--> </servlet-mapping>
-
配置SpringMVC dispatcher-servlet.xml
SpringMVC大部分组件都有默认配置,我们一般简单应用只需要指定视图解析器就行了
dispatcher-servlet.xml
<!-- 配置视图解析器,用于将Handler方法中返回的视图名解析成真正可展示的页面 --> <mvc:view-resolvers> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> </mvc:view-resolvers>
-
定义Controller
新建一个普通类,然后添加
@Controller
注解,就可以了 -
定义请求处理方法(Handler)
在Controller类中定义一个普通的方法,添加
@RequestMapping
注解就可以了
SpringMVC主要组件
视图解析器
视图解析器的作用是将请求处理方法中的返回值解析成一个真正可以渲染的页面。
常用的视图解析器
-
InternalResourceViewResolver
内部资源解析器: 用于将返回值对应到项目路径下的某个可显示的页面。比如方法返回值是index字符串,那么
InternalResourceViewResolver
解析器会在index前加上指定的前缀,在index后加上指定的后缀来拼接成指向某个视图的路径。<!-- 配置视图解析器,用于将Handler方法中返回的视图名解析成真正可展示的页面 --> <mvc:view-resolvers> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> </mvc:view-resolvers>
参数传递
页面参数传递到Controller
@RequestParam
获取请求参数,包括通过GET请求中的查询参数、POST请求中的参数等
@RequestMapping("/hello")
public String toHelloPage(@RequestParam String message, Model model) {
model.addAttribute("msg", message);
return "hello_springmvc";
}
// 当方法参数名和请求参数不一样时,可以使用注解的参数对应起来
@RequestMapping("/hello")
public String toHelloPage(@RequestParam("message") String msg, Model model) {
model.addAttribute("msg", message);
return "hello_springmvc";
}
@RequestHeader
获取请求头中的参数,如浏览器默认自带的userAgent就是请求头参数
@RequestMapping("/hello")
public String toHelloPage(@RequestHeader String userAgent, Model model) {
model.addAttribute("msg", userAgent);
return "hello_springmvc";
}
// 当方法参数名和请求头参数不一样时,可以使用注解的参数对应起来
@RequestMapping("/hello")
public String toHelloPage(@RequestHeader("userAgent") String ua, Model model) {
model.addAttribute("msg", ua);
return "hello_springmvc";
}
@PathVariable
获取请求地址中的参数,注入到方法参数中
@RequestMapping("/hello/{sname}")
public String toHelloPage(@PathVariable String sname, Model model) {
model.addAttribute("msg", sname);
return "hello_springmvc";
}
// 当方法参数名和请求地址中参数不一样时,可以使用注解的参数对应起来
@RequestMapping("/hello/{sname}")
public String toHelloPage(@PathVariable("sname") String sn, Model model) {
model.addAttribute("msg", sn);
return "hello_springmvc";
}
访问:http://localhost:8080/hello/zhangsan 会自动将zhangsan注入到方法的参数中
@RequestAttribute
jsp中
<%
request.setAttribute("sname", "虞姬req");
request.getRequestDispatcher("/param/req_scope").forward(request, response);
%>
Controller中
/**
* 请求作用域中的参数的传递
* @return
*/
@RequestMapping("/req_scope")
public String requestScopeParamShow(@RequestAttribute String sname, Model model) {
model.addAttribute("sname", sname);
model.addAttribute("type", "请求作用域参数");
return "param_show";
}
获取请求作用域中的参数
@SessionAttribute
获取Session作用域中的参数,用法和上面请求作用域中使用类似
@CookieValue
jsp中代码
cookie参数传递:<br />
<%
response.addCookie(new Cookie("sname", "yuji_cookie"));
%>
<a href="/param/cookie">发起请求</a>
Controller中
/**
* Cookie中的参数的传递
* @return
*/
@RequestMapping("/cookie")
public String cookieParamShow(@CookieValue String sname, Model model) {
model.addAttribute("sname", sname);
model.addAttribute("type", "cookie参数");
return "param_show";
}
获取Cookie中的指定数据
上面这几个注解都是用于在方法的参数上标注,用于获取不同种类的参数
Controller中的数据传递到页面
Model
handler方法定义:
@RequestMapping("/show_msg")
public String showMessage(Model model) {
model.addAttribute("msg", "我是通过model传过来的参数");
return "message_page";
}
message_page.jsp
<h1>
获取后台参数: ${msg}
</h1>
ModelAndView
/**
* ModelAndView其实是将数据Model和视图View做了一个封装,底层实现原理一样
*/
@RequestMapping("/show_msg")
public ModelAndView showMessage(ModelAndView mv) {
mv.addObject("msg", "我是通过model传过来的参数");
mv.setViewName("message_page");
return mv;
}
Model和ModelAndView传递的参数本质上也是用请求作用域来实现的,所以仅对请求转发有效。
视图控制器
用于通过配置的方式简化我们项目中不含业务逻辑的页面跳转,省去了我们写一个空方法的步骤。
视图控制器的作用和用法
方案一:在Controller中添加一个拦截/的handler方法
@RequestMapping("/")
public String toWelcomePage() {