-
SpringMVC的工作流程图
-
Spring MVC的核心类和注解
(1)DispatcherServlet:当用户通过客户端向服务器发送请求时,会被Spring MVC前端控制器DispatcherServlet所拦截。其在web.xml配置如下:
<!-- 通过以一下配置,拦截所有请求,交给SpringMVC处理 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
指定springmvc配置文件的路径,
如果配置文件为默认地址,则不需要配置
即在WEB-INF里以<servlet-name>-servlet.xml
(springDispatcherServlet-servlet.xml)
-->
<init-param>
<param-name>ContextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 启动时,以第一个身份启动,如果不存在,则应用程序会在第一个servlet请求时加载该servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
<!-- /表示处理所有请求,如果配置的是.action,则只处理.action结尾的请求 -->
</servlet-mapping>
(2)Controller注解类型
为保证Spring能够找到控制器类,需要在Spring MVC的配置文件中添加相应的扫描配置信息,同时在配置文件中配备视图解析器,以便Controller控制器类请求转发时为放回路劲添加前缀和后缀
<!-- 扫描有注解的包 -->
<context:component-scan base-package="com.springmvc.servlet"></context:component-scan>
<!-- 配置视图解析器(InternalResourceViewResolver )-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
@Controller
public class SpringmvcText {}
(3)RequestMapping注解类型
@RequestMapping注解的使用:用于映射一个请求或一个方法,可以使用该注解标注一个方法或一个类。@RequestMapping注解的使用以及属性如下:
//映射是匹配@RequestMapping注解,可以和方法名,类不一致
//通过method指定请求方式(get post delete put)
//params={"name","age!=23",...}则请求中必须含有name参数,age!=23,如果有age,则必须age!=23、可以没有age属性;!height则不能出现name=height参数
@RequestMapping(value="welcome",method=RequestMethod.POST,params= {"name"})//映射 与("welcome")相同
public String welcome() {
return "success";//view/success.jsp默认使用请求转发的跳转方式,通过视图解析器增加前缀后缀
}
//ant风格请求路径:*表示任意字符0个或多个、**表示任意目录、?表示单个字符
//@RequestMapping(value="welcome1/*/test")
//@RequestMapping(value="welcome1/a?b/test")
@RequestMapping(value="welcome1/**/test")
public String welcome1() {
return "success";
}
前端jsp对应测试
<a href="welcome1/adfbd/test">ant*</a><br>
<form action="welcome" method="post">
<input type="text" name="name">
<input type="submit" value="提交">
</form>
<a href="testPathVariable/zs">testPathVariable</a><br>
(4)REST风格:GET查、POST增、DELETE删、PUT改;普通浏览器只支持get post方式,其他请求如delete|put是通过过滤器(HiddenHttpMethodFilter)加入的;具体做法如下:
①在web.xml中配置HiddenHttpMethodFilter过滤器
<!-- 过滤器,目的是给普通浏览器增加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>
②需利用影藏域 input type=“hidden” name="_method" value=“delete|put”/>的value值指定请求方式且请求方式为post
<form action="testRest" method="post">
<input type="hidden" name="_method" value="DELETE"/>
id:<input type="text" name="id"><br>
<input type="submit" value="删">
</form>
(5)@PathVariable,@RequestParam,@RequestHeader,@CookieValue属性
@PathVariable:从请求路径获取参数
@RequestMapping(value="testPathVariable/{name}")
public String testPathVariable(@PathVariable("name") String name) {
System.out.println(name);
return "success";
}
//前端测试
<a href="testPathVariable/zs">testPathVariable</a><br>
@RequestParam:从表单获取参数值
//设置required=false,defaultValue="zs",则value可以不传值,默认为zs
@RequestMapping(value="testRequestParam")
public String testRequestParam(@RequestParam("id") Integer id,@RequestParam(value="uname",defaultValue="zs") String uname) {
//@RequestParam("id") Integer id ==Integer id = request.getParameter("id");
System.out.println(id+","+uname);
return "success";
}
/*
<form action="testRequestParam" method="post">
id:<input type="text" name="id"><br>
name:<input type="text" name="uname"><br>
<input type="submit" value="提交">
</form>
*/
@RequestHeader,@CookieValue:获取请求头和cookie值
//RequestHeader("")获取请求头信息
//CookieValue通过mvc获取cookie值(JSESSIONID)
@RequestMapping(value="testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID")String jsessionId) {
System.out.println(jsessionId);
return "success";
}
//<a href="testCookieValue">testCookieValue</a><br>
使用对象(实体类)接受请求参数
@RequestMapping(value="testObjectProperties")
public String testObjectProperties(User user) {
System.out.println(user.getId()+","+user.getName()+","+user.getAddress().getHomeAddress()+","+user.getAddress().getSchoolAddress());
return "success";
}
/*
<form action="testObjectProperties" method="post">
id:<input type="text" name="id"><br>
name:<input type="text" name="name"><br>
HAddress:<input type="text" name="address.homeAddress"><br>
SAddress:<input type="text" name="address.schoolAddress"><br>
<input type="submit" value="提交">
</form>
*/
3、处理模型数据,前面使用的例子获取数据后直接在后台打印,并没有将数据传输到view层,如果跳转时需要带数据:V、M则可以使用以下方式:
ModelAndView,ModeMap,Map,Model --数据放在request作用域@SessionAttributes,@ModelAttribute
@RequestMapping(value="testModelAndView")
public ModelAndView testModelAndView(User user) {//ModelAndView:既有数据又有视图
ModelAndView mv = new ModelAndView("success-testModelAndView");
mv.addObject("user", user);//相当于request.setAttribute("user",User);
return mv;
}
@RequestMapping(value="testModeMap")//Map,Model类似
public String testModeMap(ModelMap mm) {
User user = new User();
user.setId(123);
user.setName("name");
mm.put("user", user);
return "success-testModelAndView";
}
将数据放入session中,@SessionAttributes
@ModelAttribute经常在更新时使用
//在类头定义
//@SessionAttributes(value="user1,user2")//多个情况下
//@SessionAttributes(types=User.class)//如果在request中存放User类型对象,则同时将该类型对象放入session域中
@SessionAttributes("user")//如果在request中存放user对象,则同时将该对象放入session域中
//查询
@ModelAttribute//在任何一次请求前,都会执行@ModelAttribute修饰的方法
public void queryUserById(Map<String,Object> map) {
System.out.println("nihao");
User user = new User();
user.setId(11);
user.setName("zs");
Address address = new Address();
address.setHomeAddress("hg");
user.setAddress(address);
map.put("user",user);//map的key就是方法参数类型的首字母小写后一致
//map.put("u", user);
//public String testModelAttribute(@ModelAttribute("u")User user)
}
//修改
@RequestMapping(value="testModelAttribute")
public String testModelAttribute(User user) {
//user.setName("li");
System.out.println(user.getId()+","+user.getName()+user.getAddress().getHomeAddress());
return "success-testModelAndView";
}