SpringMvc学习文档
SpringMvc
DispatcherServlet核心控制器
Controller控制器
Handler 处理器
1.搭建SpringMvc(了解)
1.将相关jar包导入项目
2.配置web.xml文件
指定SpringMvc主配置文件存放的路径
告诉SpringMvc去哪加载配置文件
-->
3.配置SpringMvc主配置文件
生效:controller可以进行工作(接收和处理http请求) -->
base-package="com.controller"/> 4.创建一个包 com.controller,在包下创建一个类 类定义处要增加@Controller注解 5.类中新增一个方法作为处理器 6.为处理器映射访问路径,使用@RequestMapping() 2.@Controller注解(重要) /** * controller注解 * 1.注解需要写在类定义处 * 2.让一个类变成控制器 * @author muty * */ @Controller @RequestMapping("/my") publicclass MyController { } 3.@RequestMapping注解(重要) /** * 创建一个Handler * 控制器是一个java类 * 处理器是一个java方法 * 一个类中有多个java方法 * 一个控制器中有多个处理器 * 处理请求的是Handler * 和Servlet一样,需要设置一个访问路径,不然无法接受请求 * 在方法定义处增加@RequestMapping可为处理器设置访问路径 * 注意:1.访问路径的设置一般是与方法名一致 * 2. 斜杠/ 如果你的方法路径没有以斜杠开头,他会自动加上一个斜杠 * 如何访问:localhost:端口号/项目名/Handler访问路径 */ @RequestMapping("/helloSpringMvc") publicvoid helloSpringMvc(){ System.out.println("这是第一个处理器"); } 4.Handler返回JSP(重要) 1.在SpringMvc主配置文件中,配置视图解析器 2.让Handler方法的返回值为String /** * 如果要让一个Handler返回到JSP的话,那么方法的返回值为String * 要返回某一个JSP,方法的返回值直接写JSP的文件名字,不需要写后缀名 * 前缀+方法返回值+后缀=页面路径 * /WEB-INF/jsp/ + hello + .jsp * 默认是以转发方法进行跳转(request) * @return */ @RequestMapping("/testPage") public String testPage(){ return"hello"; } 5.设置请求方式(了解) /** * 为Handler设置请求方式 * 如果为Handler设置了请求方式以后,那么只支持这一种请求方式 * 其他任何请求方式都访问不到 * @return */ @RequestMapping(value="/testMethod" ,method=RequestMethod.POST) public String testMethod(){ return"hello"; } 6.@RequestPara m注解(重要) /** * @RequestParam可以接收请求参数 * 传递参数方式: * 1.a标签访问路径?id=123 request.getParameter(参数名) * 2.form表单提交在form表单中有name属性的元素会被提交 * 场景: * 假设有一个a标签将要请求到这个Handler并且携带两个参数 * 一个参数名字为id 一个参数名字为name * http://localhost:8080/SpringMvc_01/my/testParam * ?id=123&name=张三 * 用法: * 1.注解要写在方法的入参处 * String id = request.getParameter("id") --> String * value属性的就是指定参数的名字 * 可以省略 * 2.如果不写required属性,默认为true,请求时参数必须传递,否则报400错误 * 3.defaultValue 如果参数值为空的话(空字符串情况除外),那么默认值将生效 */ @RequestMapping("/testParam") public String testParam (@RequestParam(value="id") Integer id, @RequestParam(value="name", required=false,defaultValue="无名") String name){ System.out.println(id); System.out.println(name); return"hello"; } 7.用实体类接收请求参数(重要) /** * 用实体类接收请求参数 * 场景: * 新增学生输入学生名字,年龄,性别,地址 * form表单提交 * request.getParameter() * .... * 使用实体类进行写入数据 * Stustu = new Stu(); * stu.setXXX(); * .... * 用法: * 1.在Handler方法的入参处传入实体类 * 2.需要将参数名与实体类中的属性名字对应(一模一样,区分大小写) * 会将参数值自动绑定到实体类的属性上 * XXX?stuName=张三&age=25 *
*
*
* submit
*
*/
@RequestMapping("/testParamBean")
public String testParamBean(StuModel stuModel){
System.out.println(stuModel);
return"";
}
a标签传参用实体类接收
8.设置请求时的编码方式(了解)
在web.xml文件中增加配置
9.使用Servlet Api(重要)
/**
* 在Handler中使用Servlet API
* 场景:
* a标签--查询所有学生
* 向Servlet发起请求
* 1.到数据库查询所有学生-- List<实体类>
* 2.将数据集合传递到JSP request.setAttribute()
* 3.使用转发的形式跳转到列表页面的JSP
* 4.JSTL 进行循环显示数据
* 列表页面
* 用法:
* 1.如果需要使用request对象或者response对象或者其他Servlet对象 * 那么只需要在Handler方法的入参处传递即可
* 注意:
* 不要使用request进行跳转*****
*/
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request,
HttpSession session){
request.setAttribute("name", "张三");
session.setAttribute("age", 25);
return"hello";
}
Hello Spring Mvc
request中的属性${name}
session中的属性${age}
10.Ant风格访问路径的映射(了解)
/**
* Ant风格的访问路径映射
* 通配符方式
* 用法:
* 1.一个星号
* 星号代表可以匹配任意长度的任意字符
* /test/1123123123 /test/7656215371
* 只能向下匹配一级的路径
* /test/
*/
@RequestMapping("/test/*")
public String testAnt(){
return"hello";
}
/**
* 2.两个星号两个星号在一起
* 可以匹配任意路径
* 无限级
* /test/asd/s/dd/asd/asd/2/eas/da/sda/ds/asd/sa *
* /test/123
*/
@RequestMapping("/test/**")
public String testAnt1(){
System.out.println("testAnt1");
return"hello";
}
/**
* 3.问号(占位符)?
* 一个问号只能替换成一个字符
* /test/a1b2
*
*/
@RequestMapping("/test/a?b?")
public String testAnt2(){
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")
public String testModel
(@ModelAttribute("stu") StuModel stuModel,
HttpServletRequest request){
System.out.println(stuModel.getAddress());
// JSP传递了一个id Handler 我用实体类来接收id 修改Stu
/**
* handler(Stustu,request){
* 根据id查询
* 将查到的数据传递到jsp
* request.set...(stu,"stu");
* }
*/
// StuModel stu1 = new StuModel();
// 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")
public StuModel setStuModel(){
StuModel stuModel = new StuModel();
stuModel.setStuName("王五");
stuModel.setAddress("北京市");
return stuModel;
}
12.转发和重定向(重要)
/**
* 转发和重定向
* forward
* redirect
* 1.在跳转时指定方式
* 2.可以跳转到另外一个Handler上
* 如果需要从一个处理器跳转到另外一个处理器,那么需要执行跳转方式
* 如果处理器直接返回JSP,那么不需要指定方式,
*/
@RequestMapping("/forward")
public String forward(){
return"forward:toPage";
}
@RequestMapping("/toPage")
public String toPage(){
return"hello";
}
13.PathVariable注解(模板类型URL)(熟悉)
/**
* https://www.360docs.net/doc/ae12287656.html,/news/detail/24321
* https://www.360docs.net/doc/ae12287656.html,/news/detail/243976
* 模板类型的URL
* 参数占位符
* @PathVariable注解
* 场景:
* 将请求参数隐藏到访问路径中,不使用问号进行传递参数
* 用法:
* 接收请求参数,接收的是访问路径中的请求参数
* 接收时 value属性的值要和大括号中的值对应
* 注意:
* 不能接受form表单提交过来的参数和问号传递的参数
* {} 大括号代表了这是一个参数
* 访问时要将参数占位符替换为一个具体的参数值
* /testPathVariable/123
*
*/
@RequestMapping("/testPathVariable/{id}/{name}")
public String testPathVariable
(@PathVariable(value="id") Integer id,
@PathVariable(value="name") String name){
System.out.println(id);
System.out.println(name);
return"hello";
}
14.POST请求转换(了解)
1.在web.xml中配置请求转换过滤器
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) public String selectStu(){
System.out.println("查询学生");
return"";
}
//新增
@RequestMapping(value="/stuCRUD",method=RequestMethod.POST) public String insertStu(){
System.out.println("新增学生");
return"";
}
//更新
@RequestMapping(value="/stuCRUD",method=RequestMethod.PUT) public String updateStu(){
System.out.println("更新学生");
return"";
}
//删除
@RequestMapping(value="/stuCRUD",method=RequestMethod.DELETE) public String deleteStu(){
System.out.println("删除学生");
return"";
}
15.ModelAndView(重要)
/**
* ModelAndView
* 功能:
* 1.返回视图
* 2.传递数据存入到request
* 用法:
* 返回的返回值为ModelAndView
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
ModelAndView modelAndView = new ModelAndView();
//setView(View view) View是个接口
modelAndView.setViewName("hello");
//传递一个Map集合把要传递的数据全部存入map集合
//将map集合传递到addAllObjects方法里
//${https://www.360docs.net/doc/ae12287656.html,}
Map
map.put("name", "张三");
modelAndView.addAllObjects(map);
//一个参数,将一个对象存入request ?
String address = "北京";
modelAndView.addObject(address);
String add = "上海";
modelAndView.addObject(add);
//两个参数,对应key和value
modelAndView.addObject("age", 25);
return modelAndView;
}
16.ModelMap和Map集合(重要)
在SpringMvc中一共4种方式可以向request作用域保存数据
ModenAndView,ModelAttribute,ModelMap,Map集合
/**
* ModelMap -- Map集合
* 作用:
* 处理器执行完后,会将ModelMap中的所有键值对存入request
* 用法:
* 在处理器入参处声明ModelMap
*/
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
modelMap.addAttribute("name", "张三");
return"hello";
}
/**
* Map参数--java中的Map
* 作用:
* 将map集合中的键值对存入request
* 用法:
* 在处理器入参处声明Map集合
*/
@RequestMapping("/testMap")
public String testMap(Map
map.put("data", "这是map中的数据");
return"hello";
}
17.@SessionAttribute s注解(了解)
/**
* 向session中保存数据
* @SessionAttribute
* 作用:
* 将ModelMap中的数据复制到session中一份
* ModelAndView,ModelAttirbute,Map集合都是将数据先放入ModelMap * 用法:
* 只能在写类定义处
* 过程:
* 写在类定义处,作用于整个控制器
* 在执行控制器中的任意一个处理器的时候,该注解都会进行工作
* 1.用value属性中值,去跟处理器的ModelMap中的key进行匹配
* 如果发现匹配成功(一模一样),那么会将ModelMap中的该键值对复制到session
* 2.用types属性值的值,去跟处理器的ModelMap中的value的类型进行匹配
* 如果发现类型一致,那么会将该键值对复制到session
*/
用法:
在类定义处增加注解,会将匹配到的键值对复制到session
@SessionAttributes(value={"name","data"},types={String.class,Integer.class}) publicclass MyController {
18.自定义视图(熟悉)
/**
* 自定义视图使用过程
* 1.创建一个类实现View接口
* 2.实现接口中的方法
* 3.将自定义视图的类存入ioc容器
* 3.1 在类定义处增加注解,要保证这个类能被扫描到
* 3.2手动在配置文件中,使用bean标签,将类存入容器
* 4.在配置文件中配置自定义视图解析器
* @author muty
*
*/
@Component
publicclass MyView implements View{
/**
* 设置视图类型
*/
@Override
public String getContentType() {
return"text/html";
}
/**
* 视图内容
*/
@Override
publicvoid render(Map
//设置编码格式
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().print("
这是一个自定义视图
");}
}
/**
* 返回自定义视图
* 如果使用String来返回自定义视图,那么返回值写的自定义视图在ioc容器中的id */
@RequestMapping("/returnView")
public String returnView(){
return"myView";
}
@RequestMapping("/returnModelAndView")
public ModelAndView returnModelAndView(){
ModelAndView modelAndView =
new ModelAndView(new MyView());
// modelAndView.setView(new MyView());
return modelAndView;
}
19.国际化配置(了解)
方式一:通过识别浏览器语言来实现国际化
1.在src下编写资源文件,中文和英文
i18n_zh_CN.properties i18n_en_US.properties
2.在SpringMvc中配置国际化资源管理器
3.编写Handler跳转到一个国际化的JSP
4.JSP中需要导入标签库
<%@taglib prefix="fmt"uri="https://www.360docs.net/doc/ae12287656.html,/jsp/jstl/fmt"%>
这个标签库需要导入JSTL相关jar包
在JSP中使用标签获取资源文件中的键值对
5.通过切换浏览器语言来实现国际化
方式二:通过点击链接实现国际化
1.在SpringMvc配置文件中增加配置
2.在webcontent下新建test.jsp,在jsp中放置两个a标签
3.通过点击链接可实现国际化切换
20.文件上传(重要)
* 文件上传
* 1.导入两个jar包 commons-fileupload,commons-io
* 2.配置文件上传解析器
* 3.在JSP编写一个form表单,表单的method要为post
* 要为表单指定enctype="multipart/form-data"
* 要为file控件指定name属性
* 4.在Handler中接收文件,使用@RequestParam注解,
* value的值和 file控件name的值对应即可
* 使用MultipartFile来接收文件
* 注意:
* MultipartFile对象,不论是否选择了文件,值都不为null
* 如果想判断用户是否选择了文件,那么需要判断文件名是否为空
* 多个文件List
@RequestMapping("/uploadFile")
public String uploadFile(
@RequestParam(value="file") MultipartFile file,
HttpServletRequest request) throws IllegalStateException, IOException{ //获取文件名
String fileName = file.getOriginalFilename();
//获取upload文件夹的绝对路径
String realPath = request.getServletContext()
.getRealPath("/upload");
//写入文件
//拼接完整路径
String filePath = realPath + File.separator + fileName;
//根据完整路径创建File实例
File uploadFile = new File(filePath);
//上传调用MultipartFile对象的transferTo方法
file.transferTo(uploadFile);
//获取相对路径 /SpringMvc_03/upload/图片名字
String showPath = request.getContextPath()+"/upload/"+fileName;
request.setAttribute("showPath", showPath);
return"hello";
}
21.@ResponseBody注解(重要)
/**
* ResponseBody注解
* 场景:
* 1.为手机接口提供json数据
* 2.为前端提供json数据
* 3.一般情况会配合ajax来使用,如果要用ajax的方式来请求一个处理器,那么 * 处理器一定要注解ResponseBody,如果没有该注解,那么ajax将拿不到返回值 * 用法:
* 导入jackson的3个jar包
* 要写在方法定义处
* 会将Handler方法的返回值格式化为JSON,通过response响应
* 注意:
* 如果Handler被注解了 ResponseBody 那么将不能在返回视图
* 而且,注解ResponseBody的Handler request.setAttribute无意义
*/
@ResponseBody
@RequestMapping("/jsonBean")
public StuModel jsonBean() throws InterruptedException{
StuModel stuModel = new StuModel();
stuModel.setStuName("张三");
stuModel.setAge(25);
return stuModel;
}
@ResponseBody
@RequestMapping("/listJson")
public List
List
StuModel stuModel = new StuModel();
stuModel.setStuName("张三");
stuModel.setAge(25);
StuModel stuModel1 = new StuModel();
stuModel1.setStuName("李四");
stuModel1.setAge(25);
list.add(stuModel);
list.add(stuModel1);
return list;
}
ajax请求时如何传递参数
1.问号传参
2.获取form表单中所有参数
给form表单设置一个id
然后使用serialize方法获取
SpringMVC配置的基本步骤
Springmvc框架配置步骤 小弟是个新手,有不对的地方请tell me,一起研究探讨。谢谢。 1062140832@https://www.360docs.net/doc/ae12287656.html, 配置springmvc框架其实不是很难,要现有一个总体的认识,确定要分几步,每一步主要是干什么,不要太盲目。 以为web.xml是项目的入口,所以所有的配置文件,都必须引入到wem.xml中,不然,配置了等于没用。所以,要先从入口入手。 配置web.xml 1、首先引入springmvc-servlet.xml文件
SpringMVC深入总结
一、前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀。 官方的下载网址是:https://www.360docs.net/doc/ae12287656.html,/download(本文使用是的Spring 3.0.5版本) Struts2也是比较优秀的MVC构架,优点非常多比如良好的结构。但这里想说的是缺点,Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降。Struts2的多层拦截器、多实例action性能都很好。可以参考我写的一篇关于Spring MVC与Struts2与Servlet比较的文章https://www.360docs.net/doc/ae12287656.html,/admin/blogs/698217 Spring3 MVC的优点: 1、Spring3 MVC的学习难度小于Struts2,Struts2用不上的多余功能太多。呵呵,当然这不是决定因素。 2、Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分) 3、Spring3 MVC的灵活是你无法想像的,Spring的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制。 Struts2的众多优点:略... (呵呵,是不是不公平?) 众多文章开篇时总要吹些牛,吸引一下读者的眼球,把读者的胃口调起来,这样大家才有兴趣接着往后看。本文也没能例外。不过保证你看了之后不会后悔定有收获。
2.Spring-mvc框架结构及执行流程
Spring mvc架构及执行流程一、请求处理流程图 二、执行流程说明 三、组件说明
说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc 的三大组件。 需要用户编写的组件有handler、view 四、Spring MVC配置 1、组件扫描器:使用组件扫描器省去在spring容器配置每个controller类,使用
2、RequestMappingHandlerMapping:注解处理器映射器,对类中标记@RequestMapping 的方法进行映射,根据RequestMapping定义的url匹配RequestMapping标记的方 法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装 注解描述: @RequestMapping:定义请求url到处理器功能方法的映射 3、RequestMappingHandlerAdapter:注解式处理器适配器,对标记@RequestMapping 的方法进行适配。 从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用 4、
spring MVC配置详解
牧涛 --<-<-<@态度决定一切→_→。。。 ?博客园 ?首页 ?新闻 ?新随笔 ?联系 ?管理 ?订阅 随笔- 171 文章- 3 评论- 79 spring MVC配置详解 现在主流的Web MVC框架除了Struts这个主力外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。 一、Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib -nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、a ntlr-2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist-3.12.0.G A.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.4.jar、相应数据库的驱动jar 包 SpringMVC是一个基于DispatcherServlet(分发器)的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理以后再返回相应的视图(View)和模型(Model),返回的视图和模型都可以不指定,即可以只返回Model或只返回View或都不返回。 DispatcherServlet是继承自HttpServlet的,既然SpringMVC是基于DispatcherSe rvlet的,那么我们先来配置一下DispatcherServlet,好让它能够管理我们希望它管理的内容。HttpServlet是在web.xml文件中声明的。