ch01-hello-springmvc: 第一个springmvc项目。
需求: 用户在页面发起一个请求, 请求交给springmvc的控制器对象,
并显示请求的处理结果(在结果页面显示一个欢迎语句)。
实现步骤:
1 新建web maven工程
2. 加入依赖
spring-webmvc依赖,间接把spring的依赖都加入到项目
jsp,servlet依赖
3.重点: 在web.xml中注册springmvc框架的核心对象DispatcherServlet
1)DispatcherServlet叫做中央调度器, 是一个servlet, 它的父类是继承HttpServlet
2)DispatcherServlet页叫做前端控制器(front controller)
3)DispatcherServlet负责接收用户提交的请求, 调用其它的控制器对象,并把请求的处理结果显示给用户
4.创建一个发起请求的页面 index.jsp
5.创建控制器(处理器)类
1)在类的上面加入@Controller注解,创建对象,并放入到springmvc容器中
2)在类中的方法上面加入@RequestMapping注解。
6.创建一个作为结果的jsp,显示请求的处理结果。
7.创建springmvc的配置文件(spring的配置文件一样)
1)声明组件扫描器, 指定@Contorller注解所在的包名
2)声明视图解析器。帮助处理视图的。
springmvc请求的处理流程
用户点击–>起some.do请求–>tomcat(–>web.xml–>url-pattern知道 *.do–>myweb–>请求给DispatcherServlet)
–>DispatcherServlet会读取我们给的配置文件并创建容器–>根据springmvc.xml配置–>组件扫描器创建对象(会得到注解下所有的类)–>类中得到some.do对应doSome()方法
既然知道了some.do对应doSome()方法–>DispatcherServlet就把some.do转发个MyController.doSome()方法
框架执行doSome()把得到ModelAndView进行处理, 转发到show.jsp
返回值有四种:1.ModelAndView,既有数据又有转发是视图页面,返回ModelAndView是最好的
2.string,只是一个页面的跳转,也就是转发视图页面,返回string是最好的
3.void
4.Object
ch02-requestmapping: @RequestMapping的使用
1.01项目@RequestMapping是放在方法上面的,02项目我们放在类上面
2.@RequestMapping的属性method的使用,前台的请求方法必须和后台一致,除非后台没有写则get,post都可以
3.1)HttpServletRequest,2)HttpServletResponse,3)HttpSession可以直接写在处理器方法的参数位置并使用,框架内部会给他们赋值
ch03-recevieparam :1.接收请求的参数。2.配置过滤器,解决乱码的问题,让所有请求都先通过过滤器设置编码
接收请求参数,使用的处理器方法的形参
1)HttpServletRequest
2)HttpServletResponse
3)HttpSession
4)用户提交的数据:
接收用户提交的参数:
1.逐个接收:1).处理器(控制器)方法的形参名和请求中参数名一致:同名的请求参数赋值给同名的形参(例如表单中name="age"赋值给形参Integer age)
2).请求中参数名和处理器方法的形参名不一样:需要在形参定义的前面加入注解@RequestParam: 在逐个接收请求参数中, 解决请求中参数名形参名不一样的问题
2.对象接收:
注意:
在提交请求参数时,get请求方式中文没有乱码。
使用post方式提交请求,中文有乱码,需要使用过滤器处理乱码的问题。
过滤器可以自定义,也可使用框架中提供的过滤器 CharacterEncodingFilter
ch04-return: 处理器方法的返回值表示请求的处理结果,通过ajax发起请求并用返回json数据显示到页面上
1.ModelAndView(非常重要,很常用): 表示数据和视图,对视图执行forward。可以返回数据和视图,如ch01(表示的意思和返回的意思差不多)
2.String(重要):表示视图,可以是逻辑名称,也可以是完整视图路径.只能返回视图,也就是转发到新页面,但是页面不会有数据,要想有数据可以自己手工添加数据到request作用域
3.void(了解就行没啥用): 不能表示数据,也不能表示视图。
在处理ajax的时候,可以使用void返回值。 通过HttpServletResponse输出数据。响应ajax请求。
ajax请求服务器端返回的就是数据, 和视图无关。
4.Object(非常重要): 例如String , Integer , Map,List, Student等等都是对象,
对象有属性, 属性就是数据。 所以返回Object表示数据,和视图无关。
可以使用对象表示的数据,响应ajax请求。
现在做响应ajax, 主要使用返回json,使用json的数据格式。 实现步骤:
1.加入处理json的工具库的依赖, springmvc默认使用的jackson。(用于处理json)
2.在sprigmvc配置文件之间加入 mvc:annotation-driven 注解驱动。(可以把Java对象转换成json)
干的是之前的:json = om.writeValueAsString(student);
3.在处理器方法的上面加入@ResponseBody注解。(输出数据,响应ajax请求)
干的是之前的: response.setContentType(“application/json;charset=utf-8”);
PrintWriter pw = response.getWriter();
pw.println(json);
***我理解的ajax请求过程:客户端发起请求(ajax请求,里面有请求地址和数据)–》通过地址找到对应的控制器类方法,并将数据传给方法的形参
–》方法执行完后返回一个json对象–》通过success函数执行ajax请求通过控制器类方法完成后的结果,形参resp里面有控制器类方法返回的对象等数据
–》然后就可以通过返回的的对象等数据在页面上进行显示。
***我的理解:返回视图或者视图和数据一起返回的不用使用Ajax请求和json进行响应
只返回数据或者字符串的需要使用Ajax请求和json进行响应
ch05-url-pattern: 研究中央调度器的url-pattern设置为 “/”,前面的都是*.do。解决静态资源不能访问的两种方式
tomcat处理的资源:1.处理静态资源
2.处理未映射到其它servlet的请求。
当你的项目中使用了 / ,它会替代 tomcat中的default。导致所有的静态资源都给DispatcherServlet处理。
默认情况下DispatcherServlet没有处理静态资源的能力,没有控制器对象能处理静态资源的访问。所以静态资源(html,js,图片,css)都是404.
动态资源some.do是可以访问,的因为我们程序中有MyController控制器对象,能处理some.do请求。
怎么解决使用/后静态资源不能访问的问题呢?
方式一:在springmvc配置文件springmvc.xml中加入 mvc:default-servlet-handler标签还有注解驱动<mvc:annotation-driven />防止和动态资源有冲突
方式二:在springmvc配置文件springmvc.xml中使用<mvc:resources mapping=" " location=" " />标签和注解驱动<mvc:annotation-driven />防止和动态资源有冲突
ch06-path: 解决jsp页面中的路径问题, 用 “/” 开头还是不用
当你的地址 没有斜杠开头,例如 user/some.do , 当你点击链接时,访问地址是当前页面的地址加上链接的地址。
http://localhost:8080/ch06_path/ + user/some.do
参考地址是 当前页面的地址 也就是http://localhost:8080/ch06_path/
当你的地址 加斜杠开头,例如: /user/some.do, 访问地址变为
http://localhost:8080/user/some.do
参考地址是 你的服务器地址, 也就是 http://localhost:8080 我们用这个的时候可以自己加上项目的名字就解决了这个问题
但是这样就写死了,我们可以加上el表达式解决这个问题:<a href="${pageContext.request.contextPath}/user/some.do">
发起user/some.do的get请求
除了el表达式,当我们的页面跳转不到我们想要的页面或者请求时,我们可以选择加入一个base标签, 是html语言中的标签。 表示当前页面中访问地址的基地址。
你的页面中所有 没有“/”开头的地址,都是以base标签中的地址为参考地址,使用base中的地址 + user/some.do 组成访问地址。
ch07-ssm: SSM整合开发。
SSM: SpringMVC + Spring + MyBatis.
SpringMVC:视图层,界面层,负责接收请求,显示处理结果的。
Spring:业务层,管理service,dao,工具类对象的。
MyBatis:持久层, 访问数据库的
用户发起请求–SpringMVC接收–Spring中的Service对象–MyBatis处理数据
SSM整合也叫做SSI (IBatis也就是mybatis的前身), 整合中有容器。
1.第一个容器SpringMVC容器, 管理Controller控制器对象的。
2.第二个容器Spring容器,管理Service,Dao,工具类对象的
我们要做的把使用的对象交给合适的容器创建,管理。 把Controller还有web开发的相关对象
交给springmvc容器, 这些web用的对象写在springmvc配置文件中
service,dao对象定义在spring的配置文件中,让spring管理这些对象。
springmvc容器和spring容器是有关系的,关系已经确定好了
springmvc容器是spring容器的子容器, 类似java中的继承。 子可以访问父的内容
在子容器中的Controller可以访问父容器中的Service对象, 就可以实现controller使用service对象
实现步骤:
1.新建maven web项目
2.加入依赖
springmvc,spring,mybatis三个框架的依赖,jackson依赖,mysql驱动,druid连接池
jsp,servlet依赖
3.写web.xml
里面会写springmvc的配置文件地址,spring配置文件地址这两个存放容器的东西和一个额外的字符集过滤器
1)注册DispatcherServlet ,目的:1.创建springmvc容器对象,才能创建Controller类对象。
2.创建的是Servlet,才能接受用户的请求。
2)注册spring的监听器:ContextLoaderListener,目的: 创建spring的容器对象,才能创建service,dao等对象。
3)注册字符集过滤器,解决post请求乱码的问题
4.创建包, Controller包, service ,dao,实体类包名创建好
5.写springmvc,spring,mybatis的配置文件
1)springmvc配置文件,也是中央调度器的配置文件
2)spring配置文件
3)mybatis主配置文件
4)数据库的属性配置文件
6.写代码, dao接口和mapper文件, service和实现类,controller, 实体类。
7.写jsp页面
ch08-forard-redirect:转发和重定向 他们两个都是ModelAndView的setViewName的属性
forward:表示转发 一次请求,服务器内部转发然后响应 (加上了这个就是显示转发,本来默认就是转发,我们只是把它写了出来)
redirect:表示重定向 两次请求,请求服务器后服务器告知客户去请求另一个,然后客户再一次发起请求得到响应
forward和redirect都是关键字, 有一个共同的特点不和视图解析器一同工作
扩展:
forward和redirect他们都可以访问 视图文件,比如某个jsp ,html
forward:/hello.jsp forward:/main.html
forward和redirect他们都可以访问其它的controller
forward:/some.do , redirect:/other.do
处理器方法可以返回ModelAndView, String , void 都可以使用forward,redirect
ch09-exception-handler:异常处理
异常处理步骤:
1.新建maven web项目
2.加入依赖
3.新建一个自定义异常类 MyUserException , 再定义它的子类NameException ,AgeException(这些是为了演示异常的抛出)
4.在controller抛出NameException , AgeException
5.创建一个普通类,作用全局异常处理类
1)在类的上面加入@ControllerAdvice
2) 在类中定义方法,方法的上面加入@ExceptionHandler
6.创建处理异常的视图页面
7.创建springmvc的配置文件
1)组件扫描器 ,扫描@Controller注解
2)组件扫描器,扫描@ControllerAdvice所在的包名
3)声明注解驱动
ch10-exception-handler:一个拦截器
异常处理步骤:
1.新建maven web项目
2.加入依赖
3.创建Controller类
4.创建一个普通类,作为拦截器使用
1)实现HandlerInterceptor接口
2)实现接口中的三个方法
5.创建show.jsp
6.创建springmvc的配置文件
1)组件扫描器 ,扫描@Controller注解
2)声明拦截器,并指定拦截的请求uri地址
javaweb (book第七阶段) 里面的filter过滤器, 在book第七阶段,起到了让符合过滤条件的进入,不符合的跳转到登陆页面
spring 100 (ch11)配置监听器
springmvc (ch03) 配置过滤器, 解决乱码的问题,让所有请求都先通过过滤器设置编码
spingmvc 61 (ch10) 创建拦截器 类似于在book第七阶段,起到了让符合过滤条件的进入,不符合的跳转到登陆页面那个功能
拦截器和过滤器的区别
1.过滤器是servlet中的对象, 拦截器是框架中的对象
2.过滤器实现Filter接口的对象, 拦截器是实现HandlerInterceptor
3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。
拦截器是用来验证请求的,能截断请求。
4.过滤器是在拦截器之前先执行的。
5.过滤器是tomcat服务器创建的对象
拦截器是springmvc容器中创建的对象
6.过滤器是一个执行时间点。
拦截器有三个执行时间点
7.过滤器可以处理jsp,js,html等等。 可以拦截任意的请求
拦截器是侧重拦截对Controller的对象。 如果你的请求不能被DispatcherServlet接收,这个请求不会执行拦截器内容
8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应
ch11-interceptor2:多个拦截器
ch12-interceptor-permission: 使用拦截器检查登录的用户是不是能访问系统
实现步骤:
1.新建maven
2.修改web.xml注册中央调度器
3.新建index.jsp发起请求
4.创建MyController处理请求
5.创建结果show.jsp
6.创建一个login.jsp,模拟登录(把用户的信息放入到session);
创建一个jsp, logout.jsp,模拟退出系统(从session中删除数据)
7.创建拦截器,从session中获取用户的登录数据,验证能否访问系统
8.创建一个验证的jsp,如果验证视图,给出提示
9.创建springmvc配置文件
声明组件扫描器
声明拦截器