SpringMvc学习文档.docx
《SpringMvc学习文档.docx》由会员分享,可在线阅读,更多相关《SpringMvc学习文档.docx(38页珍藏版)》请在冰豆网上搜索。
SpringMvc学习文档
SpringMvc
DispatcherServlet核心控制器
Controller控制器
Handler处理器
1.搭建SpringMvc(了解)
1.将相关jar包导入项目
2.配置web.xml文件
--
如果你要使用SpringMvc的话
1.需要配置核心控制器
默认加载/WEB-INF/servlet名字-servlet.xml
加载过程:
1.tomcat启动,加载web.xml文件
2.加载核心控制器
2.1.会为核心控制器中的一个变量赋值
3.根据所配置的路径加载SpringMvc主配置文件
3.1.加载SpringMvc主配置文件
-->
dispatcher
org.springframework.web.servlet.DispatcherServlet
--
初始化参数
-->
--
不要修改!
!
指定SpringMvc主配置文件存放的路径
告诉SpringMvc去哪加载配置文件
-->
contextConfigLocation
--
具体路径
classpath表示src
-->
classpath:
springMvc.xml
--加载顺序tomcat启动时自动加载数字越小越优先加载-->
1
--为核心控制器配置访问路径-->
dispatcher
/
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
3.配置SpringMvc主配置文件
--
自动扫描
Ioc容器
base-package写的一个包的路径
会去扫描路径下的所有类
扫描的作用:
会将所有带注解的类,装进ioc容器
service,compent,Repository,controller
作用:
能够让带有controller注解的类被扫描到,并且存入容器,
让其生效
生效:
controller可以进行工作(接收和处理http请求)
-->
component-scan
base-package="com.controller"/>
4.创建一个包com.controller,在包下创建一个类
类定义处要增加@Controller注解
5.类中新增一个方法作为处理器
6.为处理器映射访问路径,使用@RequestMapping()
2.@Controller注解(重要)
/**
*controller注解
*1.注解需要写在类定义处
*2.让一个类变成控制器
*@authormuty
*
*/
@Controller
@RequestMapping("/my")
publicclassMyController{
}
3.@RequestMapping注解(重要)
/**
*创建一个Handler
*控制器是一个java类
*处理器是一个java方法
*一个类中有多个java方法
*一个控制器中有多个处理器
*处理请求的是Handler
*和Servlet一样,需要设置一个访问路径,不然无法接受请求
*在方法定义处增加@RequestMapping可为处理器设置访问路径
*注意:
1.访问路径的设置一般是与方法名一致
*2.斜杠/如果你的方法路径没有以斜杠开头,他会自动加上一个斜杠
*如何访问:
localhost:
端口号/项目名/Handler访问路径
*/
@RequestMapping("/helloSpringMvc")
publicvoidhelloSpringMvc(){
System.out.println("这是第一个处理器");
}
4.Handler返回JSP(重要)
1.在SpringMvc主配置文件中,配置视图解析器
--视图解析器-->
--
前缀指定的是JSP页面存放的位置
只有存放在这个位置的JSP文件,Handler才能返回
-->
--后缀指定的是视图的类型-->
2.让Handler方法的返回值为String
/**
*如果要让一个Handler返回到JSP的话,那么方法的返回值为String
*要返回某一个JSP,方法的返回值直接写JSP的文件名字,不需要写后缀名
*前缀+方法返回值+后缀=页面路径
*/WEB-INF/jsp/+hello+.jsp
*默认是以转发方法进行跳转(request)
*@return
*/
@RequestMapping("/testPage")
publicStringtestPage(){
return"hello";
}
5.设置请求方式(了解)
/**
*为Handler设置请求方式
*如果为Handler设置了请求方式以后,那么只支持这一种请求方式
*其他任何请求方式都访问不到
*@return
*/
@RequestMapping(value="/testMethod"
method=RequestMethod.POST)
publicStringtestMethod(){
return"hello";
}
6.@RequestParam注解(重要)
/**
*@RequestParam可以接收请求参数
*传递参数方式:
*1.a标签访问路径?
id=123request.getParameter(参数名)
*2.form表单提交在form表单中有name属性的元素会被提交
*场景:
*假设有一个a标签将要请求到这个Handler并且携带两个参数
*一个参数名字为id一个参数名字为name
*http:
//localhost:
8080/SpringMvc_01/my/testParam
*?
id=123&name=张三
*用法:
*1.注解要写在方法的入参处
*Stringid=request.getParameter("id")-->String
*value属性的就是指定参数的名字
*可以省略
*2.如果不写required属性,默认为true,请求时参数必须传递,否则报400错误
*3.defaultValue如果参数值为空的话(空字符串情况除外),那么默认值将生效
*/
@RequestMapping("/testParam")
publicStringtestParam
(@RequestParam(value="id")Integerid,
@RequestParam(value="name",
required=false,defaultValue="无名")Stringname){
System.out.println(id);
System.out.println(name);
return"hello";
}
7.用实体类接收请求参数(重要)
/**
*用实体类接收请求参数
*场景:
*新增学生输入学生名字,年龄,性别,地址
*form表单提交
*request.getParameter()
*....
*使用实体类进行写入数据
*Stustu=newStu();
*stu.setXXX();
*....
*用法:
*1.在Handler方法的入参处传入实体类
*2.需要将参数名与实体类中的属性名字对应(一模一样,区分大小写)
*会将参数值自动绑定到实体类的属性上
*XXX?
stuName=张三&age=25
*
*
*
*submit
*
*/
@RequestMapping("/testParamBean")
publicStringtestParamBean(StuModelstuModel){
System.out.println(stuModel);
return"";
}
age=26&sex=男">
a标签传参用实体类接收
--form表单提交用实体类接收-->
8.设置请求时的编码方式(了解)
在web.xml文件中增加配置
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
9.使用ServletApi(重要)
/**
*在Handler中使用ServletAPI
*场景:
*a标签--查询所有学生
*向Servlet发起请求
*1.到数据库查询所有学生--List<实体类>
*2.将数据集合传递到JSPrequest.setAttribute()
*3.使用转发的形式跳转到列表页面的JSP
*4.JSTL进行循环显示数据forEach>
*列表页面
*用法:
*1.如果需要使用request对象或者response对象或者其他Servlet对象
*那么只需要在Handler方法的入参处传递即可
*注意:
*不要使用request进行跳转*****
*/
@RequestMapping("/testServlet")
publicStringtestServlet(HttpServletRequestrequest,
HttpSessionsession){
request.setAttribute("name","张三");
session.setAttribute("age",25);
return"hello";
}
HelloSpringMvc
request中的属性${name}
session中的属性${age}
10.Ant风格访问路径的映射(了解)
/**
*Ant风格的访问路径映射
*通配符方式
*用法:
*1.一个星号
*星号代表可以匹配任意长度的任意字符
*/test/1123123123/test/7656215371
*只能向下匹配一级的路径
*/test/
*/
@RequestMapping("/test/*")
publicStringtestAnt(){
return"hello";
}
/**
*2.两个星号两个星号在一起
*可以匹配任意路径
*无限级
*/test/asd/s/dd/asd/asd/2/eas/da/sda/ds/asd/sa
*
*/test/123
*/
@RequestMapping("/test/**")
publicStringtestAnt1(){
System.out.println("testAnt1");
return"hello";
}
/**
*3.问号(占位符)?
*一个问号只能替换成一个字符
*/test/a1b2
*
*/
@RequestMapping("/test/a?
b?
")
publicStringtestAnt2(){
System.out.println("testAnt2");
return"hello";
}
11.@ModelAttribute注解(熟悉)
/**
*ModelAttribute注解
*用法:
*1.写在参数上,要求参数必须是实体类类型
*Handler会将实体类类型的参数自动存入request
*key是参数的类名首字母小写
*request.setAttribute(key,value)
*${stuModel.stuName}
*不写注解request.setAttribute("stuModel",stuModel);
*写了注解request.setAttribute("stu",stuModel);
*注意:
*1.如果手动对某个属性进行了set,那么将覆盖传递进来的值
*2.如果使用request.setAttribute()向JSP传递数据的时候
*如果key值和Handler中实体类参数类名首字母小写一样
*如果与@ModelAttribute注解中显式指定的值一样
*会被覆盖
*/
@RequestMapping("/testModel")
publicStringtestModel
(@ModelAttribute("stu")StuModelstuModel,
HttpServletRequestrequest){
System.out.println(stuModel.getAddress());
//JSP传递了一个idHandler我用实体类来接收id修改Stu
/**
*handler(Stustu,request){
*根据id查询
*将查到的数据传递到jsp
*request.set...(stu,"stu");
*}
*/
//StuModelstu1=newStuModel();
//stu1.setStuName("李四");
//stu1.setAge(99);
//request.setAttribute("stu",stu1);
//stuModel.setAge(null);
return"hello";
}
/**
*用法2:
*将注解写在方法定义处
*会将方法的返回值存入request
*如果访问了一个Controller中的某一个Handler的时候
*检测该Controller中是否有注解了@ModelAttribute的方法
*如果有,先执行注解了@ModelAttribute的方法,然后在执行Handler
*@return
*/
@ModelAttribute(value="stu")
publicStuModelsetStuModel(){
StuModelstuModel=newStuModel();
stuModel.setStuName("王五");
stuModel.setAddress("北京市");
returnstuModel;
}
12.转发和重定向(重要)
/**
*转发和重定向
*forward
*redirect
*1.在跳转时指定方式
*2.可以跳转到另外一个Handler上
*如果需要从一个处理器跳转到另外一个处理器,那么需要执行跳转方式
*如果处理器直接返回JSP,那么不需要指定方式,
*/
@RequestMapping("/forward")
publicStringforward(){
return"forward:
toPage";
}
@RequestMapping("/toPage")
publicStringtoPage(){
return"hello";
}
13.PathVariable注解(模板类型URL)(熟悉)
/**
*
*
*模板类型的URL
*参数占位符
*@PathVariable注解
*场景:
*将请求参数隐藏到访问路径中,不使用问号进行传递参数
*用法:
*接收请求参数,接收的是访问路径中的请求参数
*接收时value属性的值要和大括号中的值对应
*注意:
*不能接受form表单提交过来的参数和问号传递的参数
*{}大括号代表了这是一个参数
*访问时要将参数占位符替换为一个具体的参数值
*/testPathVariable/123
*
*/
@RequestMapping("/testPathVariable/{id}/{name}")
publicStringtestPathVariable
(@PathVariable(value="id")Integerid,
@PathVariable(value="name")Stringname){
System.out.println(id);
System.out.println(name);
return"hello";
}
14.POST请求转换(了解)
1.在web.xml中配置请求转换过滤器
--POST请求转换过滤器选择性配置如果你需要你就配置不需要就不配置-->
httpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter
httpMethodFilter
/*
2.JSP中编写FORM表单
3.编写Handler
/**
*RestFul风格
*通过访问路径能够表达出要做的事情是什么
*将请求参数放在访问路径
*GET获取资源
*POST新增资源
*PUT更新资源
*DELETE删除资源
*两个Handler访问路径一样,但是请求方式不一样,是允许的
*场景:
*学生增删改查
*将POST请求转换为除GET类型以外的请求
*用法:
*需要在web.xml中配置转换过滤器--SpringMvc提供
*注意:
*1.要转换的请求必须是POST,GET请求不能转换
*2.在form表中需要增加一个参数,name属性必须为_method
*value是你要转换为的目标请求方式
*/
@RequestMapping(value="/stuCRUD",method=RequestMethod.GET)
publicStringselectStu(){
System.out.printl