视频网址
环境搭建
contextConfigLocation
classpath:springMVC.xml
1
SpringDispatcherServlet
/
跳转
1. 跳转
@Controller
public class SpringMVCController {
public SpringMVCController() {
// TODO Auto-generated constructor stub
}
@RequestMapping("welcome")
public String welcome() {
return "success";
}
}
2. 跳转
@Controller
@RequestMapping("Controller")
public class SpringMVCController {
public SpringMVCController() {
// TODO Auto-generated constructor stub
}
@RequestMapping("welcome")
public String welcome() {
//默认使用请求转发
return "success";
}
}
支持原生态servlet
//在Controller类中
@RequestMapping(value="test")
public ModelAndView test(){
ModelAndView mv = new ModelAndView("success");//=>自动加前后缀,指明view
Student stu = new Student(1,"zs",13);
mv.addObject("student", stu);//String ,object=>request.setAttribute("student")
return mv;
}
//前端
${requestScope.student.id}//=>1
//在Controller类中
@RequestMapping(value="test")
public String test(ModelMap mm){
Student stu = new Student(1,"zs",13);
mm.put("student", stu);//request.setAttribute("student")
return "success";
}
//前端
${requestScope.student.id}//=>1
//在Controller类中
@RequestMapping(value="test")
public String test(Map map){
Student stu = new Student(1,"zs",13);
map.put("student", stu);//request.setAttribute("student")
return map;
}
//前端
${requestScope.student.id}//=>1
//在Controller类中
@RequestMapping(value="test")
public String test(Model model){
Student stu = new Student(1,"zs",13);
model.addAttribute("student", stu);//String ,object=>request.setAttribute("student")
return model;
}
//前端
${requestScope.student.id}//=>1
//在Controller类中
@SessionAttributes("name,name2")
@SessionAttributes(types= {Student.class, Address.class} )->将该类全部传入
//类名
@RequestMapping(value="test")
public String test(Model model){
Student stu = new Student(1,"zs",13);
model.addAttribute("student", stu);//String ,object=>request.setAttribute("student")
return model;
}
//前端
${requestScope.student.id}//=>1
@ModelAttribute()->在任何一次请求之前
public void queryById(Map){
Studnet stu = new Studnet()
//....具体查询
map.put("student" student);//->约定map的key就是方法参数类型的首字母,自动传入值
}
@RequestMapping(value="test")
public String test(Student stu){
stu.setName("ls");
return "success";
}
//前端
${requestScope.student.id}//=>1
前端
欢迎
Controller
@RequestMapping(value="welcome/{name}")
public String welcome(@PathVarable("name") STtring name){
syso(name)----->zs
return "success";
}
Spring mvc:
浏览器一般支持put,delete,通过过滤器(HiddenHttpMethodFilter)实现支持
过滤器拦截条件
HiddenHttpMethodFilte
org.springframework.web.filter.HiddenHttpMethodFilte
HiddenHttpMethodFilte
/*
在Spring mvc中映射地址可以相同,根据请求方式区别(method=RequestMethod.请求方式)
//i18n_ch_CN.properties
welcome=你好的ascii码
exists=退出的ascii码
//i18n_en_USA.properties
welcome=welcome
exists=exists
//在Springmvc.xml中
//前端页面将jstl/fmt,引入
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
//后端controller响应
@RequestMapping("testI18N")
public String test(){
return "success";
}
使用spring mvc实现jsp->jsp:这个注解会让所有请求转入mvc中匹配映射地址,忽略@RequestMapping
>
设定跳转为请求转发或重定向:return “redirect/forward:前缀+页面+后缀”
Spring mvc内置有常见类型转换器,
可以自定义类型转换器
public class Myconverter implements Converter {
public Myconverter() {
}
public Student convert(String source) {
//接收前端传来的字符串
String[] studentInfo = source.split("-");
//将字段内容放到对象中对应的属性
Student student = new Student();
student.setId(Integer.parseInt(studentInfo[0]));
student.setName(studentInfo[1]);
student.setAge(Integer.parseInt(studentInfo[2]));
return student;
}
}
在Springmvc.xml配置数据格式化注解所依赖的bean
在使用的属性声明
@DataTimeFormat(pattern="yyyy-MM-dd")=>传入2019-10-3=>thu dec 00:00:00 CST 2019
private Date birtthday;
@NumberFormat(pattern="###,#")->传入123,4=>1234
if(result.getErrorCount()>0){
for(FiledError error:result.getFieldErrors()){
map.put("errors", result.getFieldError);
}
}
${error.getDefaultMessage()}
//controller
@ResponseBody//通知SpringMVC,返回不是一个view。而是一个ajax,返回给调用的内容
@RequestMapping(value="testJson")
public List testJson(){
//模拟调用service->List中三个学生对象:1-zs-15,2-za-14,3-ls-21
List students = new ArrayList<>();
return students
}
导入commons-io.jar,commons-fileupload.jar
SpringMVC实现文件上传必须实现MultipartResolver接口
具体步骤(使用CommonsMultipartResolver)
public String upLoadFile(@RequestParam("desc") String desc,@RequestParam MultipartFile file){
InputStream in = file.getInputStream();
String name = file.getOriginalFilename();
OutputStream out = new FileOutputStream(path+name);
byte[] bs = new byte[1024];
int len=-1;
while( (len =in.read(bs) ) !=-1 ){
out.write(bs,0,len);
}
out.close();
in.close();
return "success";
}
//拦截实现类
public class Myinterceptor implements HandlerInterceptor {
public Myinterceptor() {}
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("拦截渲染");
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("拦截响应");
}
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("拦截请求");
//true:代表拦截后继续执行,false:拦截后中止请求
return false;
}
}
//sprinmvc.xml
异常处理必须实现HandlerInterceptor
@ExceptionHandler
@ResponseStatus
DefaultHandlerExceptionResolver:异常处理实现类,SpringMVC在常见异常基础上添加一些新的异常
SimpleMappingExceptionResolver:通过配置实现异常处理
//springmvc.xml
error
..
//web.xml
SSMExample
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
springDispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:applicationContext-controller.xml
1
springDispatcherServlet
url
//applicationContext-controller.xml
//applicationContext.xml
classpath:db.properties
//和表单对象绑定,支持多种请求
//path和对象属性一一对应
姓名:
年龄:
//path对应实体类属性值,
方式一:
方式二:
一>
二>
三>
>
方式三:
一>
>