1、搭建开发环境
a>、添加jar文件,在ioc所需jar包的基础上添加spring-web.jar,spring-webmvc.jar
b>、在web.xml中配置前端控制器
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
c>、准备一个配置文件,默认情况下,配置文件的名称为servletName-servlet.xml(example-servlet.xml),位置为WEB-INF
<!-- 打开自动扫描 -->
<context:component-scan base-package="com.sxt.springmvc.web.controller"/>
<!-- 主要作用于@Controller,激活该模式,下面是一种简写形式,完全可以手动配置替代这种简写形式,它会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter,是spring
MVC为@Controllers分发请求所必须的 -->
<mvc:annotation-driven/>
<!-- jsp页面解析器,当Controller返回XXX字符串时,先通过拦截器,然后该类就会在/WEB-INF/jsp/目录下,查找XXX.jsp文件 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
d、开发控制器
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model,String username /*获取请求参数*/ ){
model.addAttribute("msg", "Hello " + username); //向模型中放入数据
return "world";
}
@RequestMapping("/hello2")
public ModelAndView hello2( @RequestParam(value="name",required=true)String username){
ModelAndView mav = new ModelAndView();
mav.addObject("msg", "@@ Hello " + username );
mav.setViewName("world");
return mav;
}
}
2、使用@RequestMapping将请求映射至控制器的一个方法来处理
a>、请求路径:
b>、请求的方法
c>、请求参数
d>、请求头
3>、问题
a>、如何将请求映射至控制器的一个方法处理
b>、如何获取请求参数
c>、如何将model数据带入jsp
d>、如何生成响应(转发/重定向)
e>、如何访问Servlet API
f>、如何处理异常
aa>、控制器级别
@ExceptionHandler(RuntimeException.class)
public String handlerException(HttpServletRequest request,RuntimeException e) {
request.setAttribute("exception", e);
return "error";
}
bb>、全局,在spring-mvc.xml中
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
g>、如何对请求参数进行校验
添加bean-validator.jar至构建路径
在需要验证的对象的属性上使用注解声明要执行的验证规则
@NotEmpty(message="员工姓名不能为空!")
public String getName() {
return name;
}
@Range(min=0,max=10000,message="工资的范围必须在0~10000之间")
public double getSalary() {
return salary;
}
在处理方法中进行验证
@RequestMapping(value="/employee/add",method=RequestMethod.POST)
public String add(@Validated Employee emp,BindingResult br,Model model) {
if(br.hasErrors()) { //验证失败
List<Dept> depts = deptService.findAllDepts();
model.addAttribute("depts", depts); //校验失败后,错误消息及emp对象会以employee为key存储在model中
return "emp_add";
}
empService.saveEmployee(emp);
model.addAttribute("msg", "员工添加成功");
return "message";
}
在JSP页面中输出错误消息
<sf:form method="post" modelAttribute="employee">
<sf:errors path="name"/>
<sf:errors path="salary"/>
</sf:form>
日期类型如何转换
/**
* 注册类型转换器
* @param dataBinder
*/
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
CustomDateEditor cde = new CustomDateEditor(sdf, true);
dataBinder.registerCustomEditor(Date.class, cde);
}
h>、如何做国际化
i>、springMVC与spring ioc的整合
j>、restful(rest风格)url的使用
/employee/delete.do?id=7934
/pets/show.do?owerid=3&petid=5
/employee/7934 GET : /employee/7934 DELETE: /employee/7934 , POST : /employee/7934 , PUT : /employee/7934
/employee/7934/delete
/employee/7934/edit
/pets/owner/3/pet/5
k>、json响应
添加jackson相关库(jackson-annotations-2.2.0.jar,jackson-core-2.2.0.jar,jackson-databind-2.2.0.jar)至构建路径
在需要转json的处理方法中直接返回要转为json的对象
在方法上标注@ResponseBody注解
@RequestMapping(value="/employee/json")
@ResponseBody
public List<Employee> edit() {
List<Employee> emps = empService.findAll();
return emps;
}