springmvc.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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- 扫描 有注解的包 -->
<context:component-scan base-package="handler"></context:component-scan> <!--配置视图解析器(InternalResourceViewResolver) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean> <!--view-name会被视图解析器 加上前缀、后缀 -->
<mvc:view-controller path="handler/testMvcViewController" view-name="success"/> <!-- 该注解 会让 springmvc: 接收一个请求,并且该请求 没有对应的@requestmapping时,将该请求 交给服务器默认的servlet去处理(直接访问) -->
<mvc:default-servlet-handler></mvc:default-servlet-handler> <!-- 1将 自定义转换器 纳入SpringIOC容器 -->
<bean id="myConverter" class="converter.MyConverter"></bean> <!-- 2将myConverter再纳入 SpringMVC提供的转换器Bean
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myConverter"/>
</set>
</property>
</bean>
--> <!-- 3将conversionService注册到annotation-driven中 -->
<!--此配置是SpringMVC的基础配置,很功能都需要通过该注解来协调 -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 配置 数据格式化 注解 所依赖的bean FormattingConversionServiceFactoryBean:既可以实现格式化、又可以实现类型转换 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myConverter"/>
</set>
</property>
</bean> </beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> <servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <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> </web-app>
SpringMvcHandler
package handler; import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.Address;
import entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView; //接口/类 注解 配置
//@SessionAttributes(value="student4") //如果要在request中存放student4对象,则同时将该对象 放入session域中
//@SessionAttributes(types= {Student.class,Address.class}) //如果要在request中存放Student类型的对象,则同时将该类型对象 放入session域中
@Controller
@RequestMapping(value = "handler") //映射
public class SpringMVCHandler {
@RequestMapping(value = "welcome", method = RequestMethod.POST, params = {"name=zs", "age!=23", "!height"})//映射
public String welcome() {
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "welcome2", headers = {"Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding=gzip, deflate"})
public String welcome2() {
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "welcome3/**/test")
public String welcome3() {
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "welcome4/a?c/test")
public String welcome4() {
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "welcome5/{name}")
public String welcome5(@PathVariable("name") String name) {
System.out.println(name);
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "testRest/{id}", method = RequestMethod.POST)
public String testPost(@PathVariable("id") Integer id) {
System.out.println("post:增 " + id);
//Service层实现 真正的增
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "testRest/{id}", method = RequestMethod.GET)
public String testGet(@PathVariable("id") Integer id) {
System.out.println("get:查 " + id);
//Service层实现 真正的增
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "testRest/{id}", method = RequestMethod.DELETE)
public String testDelete(@PathVariable("id") String id) {
System.out.println("delete:删 " + id);
//Service层实现 真正的增
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "testRest/{id}", method = RequestMethod.PUT)
public String testPut(@PathVariable("id") Integer id) {
System.out.println("put:改 " + id);
//Service层实现 真正的增
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "testParam")
public String testParam(@RequestParam("uname") String name, @RequestParam(value = "uage", required = false, defaultValue = "23") Integer age) {
// String name = request.getParameter("uname"); System.out.println(name);
System.out.println(age);
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "testRequestHeader")
public String testRequestHeader(@RequestHeader("Accept-Language") String al) {
System.out.println(al);
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String jsessionId) {
System.out.println(jsessionId);
return "success";// views/success.jsp,默认使用了 请求转发的 跳转方式
} @RequestMapping(value = "testObjectProperties")
public String testObjectProperties(Student student) {//student属性 必须 和 form表单中的属性Name值一致(支持级联属性)
/*
String name = request.getParameter("name");
int age= Integer.parseInt(request.getParameter("age")s) ;
String haddrss = request.getParameter("homeaddress");
String saddress = request.getParameter("schooladdress");
Address address = new Address();
address.setHomeAddress(haddrss);
address.setSchoolAddress(saddress); Student student = new Student();
student.setName(name);
student.setAddress(address);
*/
System.out.println(student.getId() + "," + student.getName() + "," + student.getAddress().getHomeAddress() + "," + student.getAddress().getSchoolAddress());
return "success";
} @RequestMapping(value = "testServletAPI")
public String testServletAPI(HttpServletRequest request, HttpServletResponse response) {
// request.getParameter("uname") ;
System.out.println(request);
return "success";//succes.jsp
} @RequestMapping(value = "testModelAndView")
public ModelAndView testModelAndView() {//ModelAndView:既有数据,又有视图
//ModelAndView:Model -M View-V
ModelAndView mv = new ModelAndView("success");//view: views/success.jsp Student student = new Student();
student.setId(2);
student.setName("zs"); mv.addObject("student", student);//相当于request.setAttribute("student", student);
return mv;
} @RequestMapping(value = "testModelMap")
public String testModelMap(ModelMap mm) {//success Student student = new Student();
student.setId(2);
student.setName("zs"); mm.put("student2", student);//request域
//forward: redirect:
//
return "redirect:/views/success.jsp";
} @RequestMapping(value = "testMap")
public String testMap(Map<String, Object> m) { Student student = new Student();
student.setId(2);
student.setName("zs");
m.put("student3", student);//request域 return "success";
} @RequestMapping(value = "testModel")
public String testModel(Model model) { Student student = new Student();
student.setId(2);
student.setName("zs");
model.addAttribute("student4", student);//request域
return "success";
} @ModelAttribute//在任何一次请求前,都会先执行@ModelAttribute修饰的方法
//@ModelAttribute 在请求 该类的各个方法前 均被执行的设计是基于一个思想:一个控制器 只做一个功能
public void queryStudentById(Map<String, Object> map) {
//StuentService stuService = new StudentServiceImpl();
//Student student = stuService.queryStudentById(31);
//模拟调用三层查询数据库的操作
Student student = new Student();
student.setId(31);
student.setName("zs");
student.setAge(23);
// map.put("student", student) ;//约定:map的key 就是方法参数 类型的首字母小写
map.put("stu", student);//约定:map的key 就是方法参数 类型的首字母小写
} //修改:Zs-ls
@RequestMapping(value = "testModelAttribute")
public String testModelAttribute(@ModelAttribute("stu") Student student) {
student.setName(student.getName());//将名字修改为ls
System.out.println(student.getId() + "," + student.getName() + "," + student.getAge());
return "success";
} @RequestMapping(value = "testI18n")
public String testI18n() {
return "success";
} @RequestMapping(value = "testConverter")
public String testConverter(@RequestParam("studentInfo") Student student) {// 前端:2-zs-23 System.out.println(student.getId() + "," + student.getName() + "," + student.getAge()); return "success";
} @RequestMapping(value = "testDateTimeFormat")//如果Student格式化出错,会将错误信息 传入result中
public String testDateTimeFormat(Student student, BindingResult result) { System.out.println(student.getId() + "," + student.getName() + "," + student.getBirthday()); if (result.getErrorCount() > 0) {
for (FieldError error : result.getFieldErrors()) {
System.out.println(error.getDefaultMessage());
}
}
return "success";
} }
Myconvert
package converter; import entity.Student;
import org.springframework.core.convert.converter.Converter; public class MyConverter implements Converter<String, Student> { @Override
public Student convert(String source) {//source:2-zs-23
String[] studentStrArr = source.split("-");
Student student = new Student();
student.setId(Integer.parseInt(studentStrArr[0]));
student.setName(studentStrArr[1]);
student.setAge(Integer.parseInt(studentStrArr[2]));
return student;
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <!-- 如果web.xml中的配置是
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>.action</url-pattern>
</servlet-mapping> <a href="user/welcome.action">first springmvc - welcome</a> 交由springmvc处理 找 @RuestMapping映射
<a href="user/welcome.action">first springmvc - welcome</a>交由springmvc处理 找 @RuestMapping映射
<a href="xxx/welcome">first springmvc - welcome</a> 交由servlet处理 找url-parttern /@WebServlet()
-->
<a href="handler/welcome3/xyz/abcz/asb/test">33333333get - welcome</a>
<br/>
<a href="handler/welcome4/abc/test">4444444get - welcome</a>
<br/>
<a href="handler/welcome5/zs">555welcome</a> <form action="handler/welcome" method="post">
name:<input name="name" ><br/>
age:<input name="age" >
height:<input name="height" >
<input type="submit" value="post">
</form> <br/>======<br/> <form action="handler/testRest/1234" method="post">
<input type="submit" value="增">
</form> <form action="handler/testRest/1234" method="post">
<input type="hidden" name="_method" value="DELETE"/>
<input type="submit" value="删">
</form> <form action="handler/testRest/1234" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit" value="改">
</form> <form action="handler/testRest/1234" method="get">
<input type="submit" value="查">
</form>
------------<br/>
<form action="handler/testParam" method="get">
name:<input name="uname" type="text" />
<input type="submit" value="查">
</form>
<br/>
<a href="handler/testRequestHeader">testRequestHeader</a>
<br/>
<br/>
<a href="handler/testCookieValue">testCookieValue</a><br/>
<a href="handler/testServletAPI">testServletAPI</a>
<br/>
<form action="handler/testObjectProperties" method="post">
id:<input name="id" type="text" />
name:<input name="name" type="text" />
家庭地址:<input name="address.homeAddress" type="text" />
学校地址:<input name="address.schoolAddress" type="text" />
<input type="submit" value="查">
</form> <br/>
<a href="handler/testModelAndView">testModelAndView</a>
<br/>
<br/>
<a href="handler/testModelMap">testModelMap</a>
<br/>
<br/>
<a href="handler/testMap">testMap</a>
<br/>
<br/>
<a href="handler/testModel">testModel</a>
<br/>
<br/>
<a href="handler/testI18n">testI18n</a>
<br/> <form action="handler/testModelAttribute" method="post">
编号:<input name="id" type="hidden" value="31" />
姓名:<input name="name" type="text" />
<input type="submit" value="修改">
</form> <br/>
<a href="handler/testMvcViewController">testMvcViewController</a>
<br/> <form action="handler/testConverter" method="post">
学生信息:<input name="studentInfo" type="text" /><!-- 2-zs-23 -->
<input type="submit" value="转换">
</form> <form action="handler/testDateTimeFormat" method="post">
编号:<input name="id" type="text" value="31" />
姓名:<input name="name" type="text" />
出生日期:<input name="birthday" type="text" />
<input type="submit" value="修改">
</form> </body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
welcome to spring mvc success<br/>
==== request:<br/>
${requestScope.student.id } -${requestScope.student.name } <br/>
${requestScope.student2.id } -${requestScope.student2.name } <br/>
${requestScope.student3.id } -${requestScope.student3.name } <br/>
${requestScope.student4.id } -${requestScope.student4.name } <br/> ==== session:<br/>
${sessionScope.student.id } -${sessionScope.student.name } <br/>
${sessionScope.student2.id } -${sessionScope.student2.name } <br/>
${sessionScope.student3.id } -${sessionScope.student3.name } <br/>
${sessionScope.student4.id } -${sessionScope.student4.name } <br/>
</body>
</html>
Student
package entity; import org.springframework.format.annotation.DateTimeFormat; public class Student {
private int id;
private String name;
private Address address; public String getBirthday() {
return birthday;
} public void setBirthday(String birthday) {
this.birthday = birthday;
} @DateTimeFormat(pattern="yyyy-MM-dd")//格式化:前台传递来的数据,将前台传递来到数据 固定为yyyy-MM-dd
private String birthday; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} private int age; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Address getAddress() {
return address;
} public void setAddress(Address address) {
this.address = address;
} }