JavaEE体系结构包括四层,从上到下分别是应用层、Web层、业务层、持久层。Struts和SpringMVC是Web层的框架,Spring是业务层的框架,Hibernate和MyBatis是持久层的框架。
为什么要使用SpringMVC?
很多应用程序的问题在于处理业务数据的对象和显示业务数据的视图之间存在紧密耦合,通常,更新业务对象的命令都是从视图本身发起的,使视图对任何业务对象更改都有高度敏感性。而且,当多个视图依赖于同一个业务对象时是没有灵活性的。
SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化我们日常Web开发。
SpringMVC架构
SpringMVC是Spring的一部分,如图:
SpringMVC的核心架构:
SpringMVC入门程序
1.第一步导入包(记得一定要放在web-inf目录下)
这些大概需要的,之前忘记放在web-inf目录下了一直出不来效果
2.配置web.xml文件
<context-param>
<!--
加载配置文件
默认加载规范:
* 文件命名:servlet-name-servlet.xml====springmvc-servlet.xml
* 路径规范:必须在WEB-INF目录下面
修改加载路径:
-->
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/dispatcherservlet-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextCleanupListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcherservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherservlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.配置dispatcherservlet-servlet.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.xiaonuo.domain"/>
<!--在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,
会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,
它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,
就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。-->
<mvc:default-servlet-handler />
<mvc:annotation-driven />
/*SpringMVC视图解析器InternalResourceViewResolver*/
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3 配置类
/*默认是请求转发*/
@Configuration
@RequestMapping("/mvc")
public class WeclomeHanderl {
//method 指定请求的方法 params 指定请求的参数 !sex是指不能包含sex
//@RequestMapping(value = "wec.html", method = RequestMethod.GET,params = {"name=zs","age!=2","!sex"})
@RequestMapping(value = "wec.html")
public String print(){
System.out.println("123");
return "success";
}
}
4 @PathVariable的用法
@RequestMapping(value = "parm/{name}/{age}")
public void parm(@PathVariable("name") String name,@PathVariable("age") Integer age){
System.out.println(name);
System.out.println(age);
}
通过@PathVariable 获取请求带的子地址 获取值
5 配置delete put请求
添加 <input name="_method" type="hidden" value="DELETE">
form的请求一定是post,原因见下图
<form action="${pageContext.request.contextPath}/mvc/delete" method="post">
<input name="_method" type="hidden" value="DELETE">
<input type="submit" value="删">
</form>
<form action="${pageContext.request.contextPath}/mvc/put" method="post">
<input name="_method" type="hidden" value="PUT">
<input type="submit" value="改">
<input type="text" name="name">
</form>
配置过滤器
<!--增加个过滤器 给普通浏览器delete put请求-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
InternalResourceViewResolver中的方法
编写方法
@RequestMapping(value = "delete",method = RequestMethod.DELETE)
public String delete(){
System.out.println("delete");
return "success";
}
@RequestMapping(value = "put",method = RequestMethod.PUT)
@ResponseBody
public String put(@RequestParam("name") String name){
System.out.println("put"+name);
return "success";
}
@RequestParam 获取参数
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
使用delete和put方法请求页面的时候会提示jsp不支持
解决方法:在jsp头文件添加 isErrorPage="true"
注释/属性详解
@RequestParam 获取参数
@RequestHeader 获取请求头
@CookieValue 获取cookies
@SessionAttributes(value = {"student1"},types = Student.class) 当写入request中的时候会将指定的自动加入到session中去
required 设置false 可以参数选择缺省,当没有值的时候可以在 defaultValue 设置值
HttpServletRequest request, HttpServletResponse response 在形参里面加可以获取request和response
Student student 可以直接封装类
写入request域中的几个方法:
@ModelAttribute的用法