从头到脚细致解说SPRING-MVC,走向spring大家庭的怀抱

1.回顾mvc

二阶段的封装代码中,问题

使用springmvc,减少开发量,让上述的工作,给springmvc去做

2.springmvc介绍

首先,springmvc是spring中的一个模块,也是一个mvc设计思想的框架

The Spring Web model-view-controller (MVC) framework is designed around a DispatcherServlet that dispatches requests to handlers, with configurable handler mappings, view resolution, locale and theme resolution as well as support for uploading files.

springmvc设计核心,是DispatcherServlet,是用来接收和分发请求给具体的handler(类似二阶段封装中的Controller,是由程序员开发的),通过请求和handler之间的映射配置(类似mvc.xml),最后,通过视图解析器解析页面响应。支持文件上传

3.springmvc框架搭建

需求:浏览器输入请求地址 http://localHost:8080/teacher_springmvc/hello访问服务器,服务器响应hello.jsp给浏览器

1)新建teacher_springmvc01

2)导包

核心包

还需要拷贝之前spring框架中的jar包

3)配置文件

log4j.properties

springmvc框架自己的配置文件,applicationContext-mvc.xml(名字不重要,也可以是springmvc.xml)

配置文件直接拷贝之前spring的配置文件

web.xml(是tomcat加载工程的唯一入口)

给servlet加load标签,一般是servlet在第一次被访问的时候实例化,加了load标签,就是tomcat启动的时候就实例化。

4)部署到tomcat中,启动tomcat

报错:

DispatcherServlet在实例化的时候,会默认去WEB/INF目录下找配置文件,配置文件的文件名为 web.xml中servlet配置的servlet-name + “-servlet.xml”

拷贝applicationContext-mvc.xml到在WEB-INF下,并重命名为springmvc-servlet.xml

重启服务器—》成功

但是!!我们的配置文件,肯定不会直接放在WEB/INF下,而是放在src下,编译之后的目录是WEB/INF下的class目录

这时,我们需要告诉DispatcherServlet,配置文件的路径+文件名,替换默认路径和文件名

删除WEB/INF下的springmvc-serlvet.xml

重启服务器

--成功

5)入门案例,HelloWorld

浏览器输入请求地址 http://localHost:8080/teacher_springmvc/hello访问服务器,服务器响应hello.jsp给浏览器

a. handler编写,用于处理/hello请求

b.hello.jsp

c. 请求地址和handler之间的映射

重启,访问

因为web.xml配置DispatcherServlet拦截的地址为 /*,所以不管是jsp还是/hello还是js,css的请求,会全部都到DispatcherServlet中。会404

处理办法:将需要给DispatcherServlet拦截的请求加个标识,拦截.action结尾的请求

浏览器请求地址:http://localHost:8080/teacher_springmvc/hello.action

映射配置:

重启,重新访问

4.springmvc 注解模式

teacher_springmvc02

1)controller可以脱离springmvc的api

2)配置文件中开启注解

3)代码中使用注解

5.执行流程

1.tomcat启动的时候加载应用,解析web.xml

需要在启动之后,实例化DispatcherServlet.

DispatcherServlet实例化的时候,默认加载了一个配置文件DispatcherServlet.properties

DispatcherServlet加载这个配置文件,主要的目的,就是实例化它的各种帮手。

除了默认加载的配置文件,DispatcherServlet还加载了我们指定的配置文件

先解析applicationContext-mvc.xml,

如果有bean配置,那么实例化bean,然后拿bean的name属性作为key,实例作为value.

如果有开启注解的标签,那么DispatcherServlet会扫面指定的包

扫描指定包的时候,找@Controller和@RequestMapping注解

@Controller注解,用来生成实例

@RequestMapping用来映射请求地址和方法之间的映射

如果还有其他的标签,会继续做相应的事。

2.浏览器请求http://localHost:8080/teacher_springmvc/hello.action

3.tomcat服务器接收到浏览器的请求,先拆分看请求的是 哪个应用,然后看请求地址有没有在web.xml中配置到。如果web.xml中没有配置拦截,那么就根据路径指向具体的资源(比如teacher_springmvc/index.jsp,那么tomcat会发现web.xml中没有要接收这个请求的,那么就从webRoot开始,找index.jsp响应给浏览器,没找到,404)

但是,请求的是teacher_springmvc/hello.action ,web.xml中,有个servlet配置,接收*.action的请求,请求地址hello.action符合要求,那么tomcat就会把这个请求丢给DispatcherServlet

4.DispatcherServlet拿到这个请求,会找处理器映射器帮忙,找是那个映射关系。

找到映射关系,等于找到了哪个Controller处理这个请求

继续找处理器适配器帮忙,调用具体的Controller中的具体方法

5.DispatcherServlet拿到Controller层处理之后的返回值。

又继续找视图解析器帮忙,解析响应指定的页面给浏览器

6.@RequestMapping应用

6.1方法上使用

请求地址:

http://localhost:8080/teacher_springmvc/hello.action

6.2用在类上,作用类似namespace

请求该类中每个方法,都需要带上namespace, namespace就是类上的RequestMapping指定的路径

1+2组成的请求地址,在整个工程中不能重复

6.3 @RequestMapping 默认支持get/post两种请求方式。

那如果,我只要支持其中的一种

显式的定义,支持post、get

7.Controller层方法的返回值

7.1 ModelAndView

ModelAndView可以给跳转页面地址

绝对路径,以 / 打头

页面跳转是转发还是重定向?

默认为转发

那如果要重定向?页面地址前加上 redirect:


ModelAndView除了可以放view视图(jsp),还可以放model(数据)

7.2 String

返回值String:为需要跳转的页面

默认转发

如果要使用重定向

7.3 void

方法没有返回值,在方法中,使用response直接给页面响应

8.Controller层方法参数

8.1 默认参数(Servlet API)

HttpServletRequest, HttpServletResponse, HttpSession, ModelAndView ,ModelMap


8.2 简单类型

String,int之类

形参的命名=前台页面控件的name属性值

类型转换-》框架会做

一般用于属性较少的添加和查询功能

8.3 自定义对象

提交参数的key需要和实体类属性名保持一致

提交参数key: 如果是form表单,key就为form控件中的name属性

如果是其他的提交方式,比如get, …action?key1=value1&key2=value2,那么,key1,key2都需要和实体类属性名一致

8.4 包装类

自定义对象中含有自定义对象

Product中Company对象传参

jsp页面,控件的name属性值,需要使用导航符。

8.5数组

checkbox类型

参数使用String类型

参数使用数组类型

如果前台使用的checkbox,那么参数可以是String类型,也可以是数组类型,如果value为number类型,那么数组可以直接定义为int类型数组

8.6 类型转换

之前的参数中,有String—》int, 也有String—》double这些类型转换,springmvc框架中内置的。

但是如果想要String Date, 比如产品的发行时间,通过req取出参数肯定是String类型,但是我们的实体类,或者说直接使用参数接收,那么框架不支持转换,需要自定义转换器

1) 定义转换器

2)将转换器注册到框架中

3)mvc框架集成自定义的转换器

需要使用到mvc打头的标签,要使用mvc中的标签,需要引入mvc的约束

使用mvc标签,集成自定义转换器

springmvc框架中,遇到StringDate类型,会自动调用自定义的转换器。

如果已有的转换器,重新定义,比如String Integer ,那么,自定义的转换器会覆盖内置转换器


9.乱码问题

get/post

POST

使用springmvc中的字符集过滤器

GET

使用终极大招

tomcat/conf/server.xml中指定url编码格式

get方式提交,参数是直接跟在请求地址之后,请求地址是由tomcat解析的。让tomcat在解析的时候,使用我们指定的编码格式解析

10.springmvc+spring+mybatis集成(dao+xml配置版本)

teacher_ssm01

1)导包

导入spring+mybatis最后一个版本的包

至于springmvc,检查下是否含有spring-web和spring-webmvc这两个包,如果没有,重新导入。

2)配置文件

log4j.properties

db.properties---》数据源配置,给spring引入使用

sqlMapConfig.xml --------mybatis

applicationContext.xml----------spring

applicationContext-mvc.xml--------springmvc

web.xml------DispatcherServlet需要配置,spring中的实例也需要tomcat创建,所以,spring的入口也在web.xml中配置

DispatcherServlet

spring入口—》监听

3)部署,启动

未报错,但是不能证明框架集成成功

4)案例

查询所有的企业展示

1.建表

insert数据。。。。。。

2)实体类

Company.java

3)CompanyDao接口,CompanyDaoImpl实现类,company.xml

company.xml

实现类

4)sqlMapConfig.xml中注册配置文件

5)CompanyService,接口,实现类

6)Controller

7)service,dao在applicationContext中的bean配置

8)controller中的注解配置

9)springmvc配置文件中,开启注解

10)companyManager.jsp

路径需要Controller中返回的路径一致

a.拷贝资源目录

--》

b.复制companyManager.html到webRoot/pages/backend目录

c.将html修改为jsp

第一步先复制jsp文件内容到html

第二步修改后缀

第三步,修改所有的引用地址为绝对

第四步:使用c标签解析comList

11) 部署,启动

12)浏览器访问地址

11.springmvc+spring+mybatis+mapper代理+注解

1)拷贝teacher_ssm01工程,代码结构调整

2)company.xml中的namespace调整

3)修改company.xml在sqlMapConfig.xml中的路径

4)service使用注解

5)在spring中配置mapper代理生成

6)springmvc配置文件中,一定要打开注解

如果这个扫描的包已经包含了Service,dao等等,那么spring配置文件中applicationContext.xml不需要再开启一次注解

如果applicationContext-mvc.xml中的包只有com.njwb.controller

那么,applicationContext.xml中需要重新开启注解,扫描service,dao …

案例:

添加企业

1)添加企业ID的序列

2)接口,company.xml提供添加

3)service

4)controller

校验参数

调用service添加数据

跳转到列表页

5)修改companyAdd.html

a.修改companyManager.jsp中的跳转地址

b.修改companyAdd.html为jsp文件

c.修改添加页面的form提交地址,提交方式

d.给需要提交到后台数据的控件添加name属性

e.要取详情内容,使用隐藏域

目前代码中的校验

如果属性比较多,代码就会很多,并且,修改中也会有很多的重复代码,因为修改中也需要做校验,并且,校验一般和添加差不多

并且,校验完成之后,目前是跳转到result.jsp

但是从用户的角度来说,校验不通过,一般回到添加页面,并且,原始数据有回显,然后有相依的错误信息提示

不使用校验框架也可以做到,不过,使用校验框架,编码更简单,提示信息也可以作为配置文件

12.校验框架

teacher_ssm04

使用hibernate校验框架

1)导包

2)在mvc中配置校验器

3)需要在mvc框架中启用校验器

4)代码中使用

在实体类中,使用注解标明这个属性的规则是什么样子的

在Controller的方法中,需要告诉springmvc,形参Company company,需要使用校验框架做校验

页面效果:

将错误信息放到配置文件中

数据回显

校验框架,支持数据回填

默认key为实体类类名,第一个字母小写。不需要显示的传值

案例:

如果就是要修改一下传值的key,使用

并不是每种场景校验都一模一样

比如:添加和修改。

添加中,每个属性都需要校验

修改: 不允许修改的属性,还需要校验么???

假设:企业数据中,佣金不允许修改

添加需要校验 企业名称、佣金、详情

修改需要校验 企业名称、详情

校验需要分场合,分场景

把实体类属性中的校验分组

校验分组

1)首先需要定义两个空接口,作为两个标识

2)给实体类中的规则分组

3)Controller中使用分组校验

校验注解:

逻辑性校验校验框架做不了,比如,重名校验

13.springmvc中使用ajax

1)使用response响应

2 ) 使用@ResponseBody注解响应

使用该注解,表示,返回值不管是啥,直接响应给浏览器

返回String

返回Company

让springmvc框架自动的将对象转换成json格式的字符串,需要导包

代码:

jsp:

结果:

14.springmvc上传

1)jsp中的form表单处理和Servlet上传处理一致

method=”post”,enctype需要处理

2)Controller中使用mvc包中的类直接接收文件对象

需求:给企业添加一个图片

1)数据库添加字段

img_url(上传路径), img_real_name(原始文件名)

2)实体类添加属性

3)需要修改的功能:

企业添加,企业修改,企业列表页展示,企业详情也要展示

4)企业添加:

a.修改company.xml中的insert语句
b.Controller添加方法中,参数,直接找框架要浏览器提交的文件对象

c.需要使用文件对象,那么需要在mvc中配置文件解析器

d.页面添加file控件

e.form表单处理

f.测试Controller中能不能拿到文件对象

g.指定文件上传的路径

h.文件上传地址,使用配置形式;文件重命名,使用当前时间的时分秒毫秒形式

15.列表页的table中省略显示详情

页面效果:

解决方式

Company实体类中,提供一个get方法,获取这个String

页面使用el取值

16.文件下载

1)页面请求地址

比如

2)需要有一个Controller处理下载请求

a.Servlet通用下载,使用response响应文件流

3)SpringMVC下载

16.Springmvc中的异常处理

teacher_ssm06

1.定义异常处理器

2.注册自定义异常处理器

17. Spring中的定时任务—SpringJob

1)导包

2)定义定时任务

3)配置定时任务

1.定时任务bean

2.定时任务触发器(间隔时间)

3.spring定时任务配置所有的触发器

到点之后,不管上一个定时任务是否结束,

1)到点仍然开启新一轮定时任务,允许同一个定时任务有多个线程存在

2)到点之后,等待上一个定时任务结束,然后再开启新一轮定时任务

如果涉及到数据库数据更新,那么定时任务,不应该是可以多线程。

实现接口就可以了,不需要编写额外的代码

展开阅读全文

页面更新:2024-03-23

标签:从头到脚   注解   转换器   大家庭   细致   怀抱   框架   实例   属性   浏览器   走向   参数   类型   页面   地址

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top