SpringMvc学习文档

SpringMvc学习文档
SpringMvc学习文档

SpringMvc

DispatcherServlet核心控制器

Controller控制器

Handler 处理器

1.搭建SpringMvc(了解)

1.将相关jar包导入项目

2.配置web.xml文件

dispatcher

org.springframework.web.servlet.DispatcherServlet

指定SpringMvc主配置文件存放的路径

告诉SpringMvc去哪加载配置文件

-->

contextConfigLocation

classpath:springMvc.xml

1

dispatcher

/

CharacterEncodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

utf-8

CharacterEncodingFilter

/*

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文件中增加配置

CharacterEncodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

utf-8

CharacterEncodingFilter

/*

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中配置请求转换过滤器

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) 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,}

Mapmap = new HashMap();

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(Mapmap){

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(Maparg0, HttpServletRequest request, HttpServletResponse response) throws Exception {

//设置编码格式

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 listJson(){

Listlist = new ArrayList();

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 org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/mvc/springmvc-servlet.xml 1 2、将spring加载到web.xml中 org.springframework.web.context.ContextLoaderListener 3、配置上下文路径 contextConfigLocation /WEB-INF/spring/spring.xml,/WEB-INF/spring/spring-*.xml 说明:如果有很多的关于spring的配置文件,建议分开写,比如事务一个文件(spring-transaction.xml),springmvc-hibernate.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类,使用 自动扫描标记@controller的配置如下:

2、RequestMappingHandlerMapping:注解处理器映射器,对类中标记@RequestMapping 的方法进行映射,根据RequestMapping定义的url匹配RequestMapping标记的方 法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装 注解描述: @RequestMapping:定义请求url到处理器功能方法的映射 3、RequestMappingHandlerAdapter:注解式处理器适配器,对标记@RequestMapping 的方法进行适配。 从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用 4、:spring mvc 使用自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在spring-mvc.xml 配置文件总使用替代注解处理器和适配器的配置。 5、视图解析器 InternalResourceViewResolver:支持JSP视图解析 viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl 的相关jar 包。此属性可以不设置,默认为JstlView。 prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:

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文件中声明的。 spring org.springframework.web.servlet.DispatcherServlet< /servlet-class> contextConfigLocation classpath:springMvc.xml 1 dispatcher / CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 CharacterEncodingFilter /* 3.配置SpringMvc主配置文件