2021.7.23
今天学习的是springmvc
创建项目的步骤
需求:用户在页面发起一个请求,请求交给springmvc的控制器对象
并显示请求的处理结果(在结果页面显示一个欢迎语句)
实现步骤:
新建web maven工程
加入依赖
spring-webmvc依赖,间接的把spring的依赖都加入到了项目
jsp,servlet依赖重点:在web.xml中注册springmvc的核心对象DispatcherServlet
1.DispatcherServlet叫做中央调度器,是一个servlet,它的父类是继承HttpServlet
2,DispatcherServlet也叫作前段控制器(front controller)
3,DispatcherServlet负责接收用户提交的数据,调用其他控制器对象,并把请求的处理结果显示给用户创建一个发起请求的页面 index.jsp
创建控制器
- 在类的上面加入@Controller注解,创建对象,并放入到springmvc容器中
- 在类中的方法上面加入@RequestMapping注解
创建一个作为结果的jsp,显示处理结果
创建springmvc配置文件(与spring的配置文件一样)
- 声明组件扫描器,指定@Controller注解所在的包名
- 声明试图解析器,帮助处理视图的
** 在提交请求的过程中,post方式乱码,get方式没有乱码,可以使用过滤器解决**
pom.xml
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.5.RELEASE</version> </dependency> </dependencies>
controller
/** * @Controller创建处理器对象,对象放在springmvc容器中 * 位置:在类的上面 * * 能处理请求的都是控制器(处理器):MyController能处理请求,叫做后端控制器(back controller) */ @Controller @RequestMapping("/test") public class MyController { /* * 逐个接收请求参数: * 要求:控制器方法的形参名和请求参数名必须一致 * 同名的请求参数赋值给同名的形参 * 框架接收请求参数 * 1,使用request对象接收请求参数 * String strName=request.getParameter("name"); * 2,springmvc框架通过DispatcherServlet调用myController的doSome()方法 * 调用方法时,按名称对应。把接收的参数赋值给形参 * 框架提供类型转换功能,把string转为其他基本类型 * */ @RequestMapping(value = {"/some.do", "/first.do"}) //当你不确定年龄值有没有的时候,可以换成Integer public ModelAndView doSome(String name,Integer age){ //现在就可以在方法中直接使用name和age了 ModelAndView mv=new ModelAndView(); mv.addObject("myname",name); mv.addObject("myage",age); mv.setViewName("show"); return mv; } @RequestMapping({"/other.do", "/second.do"}) public ModelAndView doOther(){ ModelAndView mv=new ModelAndView(); mv.addObject("msg","欢迎使用springmvc做web开发"); mv.addObject("fun","执行的是doOther方法"); mv.setViewName("other"); return mv; } }
springmvc.xml
<!--声明组件扫描器--> <context:component-scan base-package="com.myweb.controller"/> <!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀:视图文件的路径--> <property name="prefix" value="/WEB-INF/view/"/> <!--后缀:视图文件的扩展名--> <property name="suffix" value=".jsp"/> </bean>
web.xml
<!--声明注册springmvc核心对象 需要在TomCat服务器启动后创建DispatcherServlet对象的实例 为什么要创建这个对象的实例呢? 因为DispatcherServlet在它的创建过程中,会同时创建springmvc容器对象, 读取springmvc的配置文件,把这个配置文件中的对象都创建好,当用户发起请求时就可以直接使用对象了 servlet的初始化会执行init()方法,DispatcherServlet在init中{ //创建容器,读取配置文件 WebApplicationContext ctx=new ClassPathXMlApplicationContext(springmvc.xml) //把容器对象放入到servletContext中 getServletContext().setAttribute(key,ctx); } --> <!--springmvc创建容器对象时,默认读取的是这个文件 (/WEB-INF/<servlet-name>-servlet.xml)--> <servlet> <servlet-name>myweb</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--自定义springmvc读取的配置文件的位置--> <init-param> <!--springmvc的配置文件的位置的属性--> <param-name>contextConfigLocation</param-name> <!--指定自定义文件的位置--> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- load-on-startup:表示在Tomcat启动后创建对象的顺序,是整数,数值越小,创建对象越早。大于等于0的整数 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>myweb</servlet-name> <!-- 使用框架的时候, <url-pattern>可以使用两种方式 1,扩展名,自定义扩展名,常用:*.do,*.action,*.mvc等 2,使用斜杠"/" --> <url-pattern>*.do</url-pattern> </servlet-mapping> <!--注册声明过滤器,解决post乱码问题--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--设置项目中使用的字符编码--> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <!--强制请求对象(HttpServletRequest)使用很encoding编码的值--> <init-param> <param-name>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <!--强制应答对象(HttpServletResponse)使用很encoding编码的值--> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <!-- /*表示强制所有的请求先通过过滤器--> <url-pattern>/*</url-pattern> </filter-mapping>
笔记
SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的。
理解是servlet的一个升级
web开发底层是servlet , 框架是在servlet基础上面加入一些功能,让你做web开发方便。
SpringMVC就是一个Spring。 Spring是容器,ioc能够管理对象,使用<bean>,* @Component, @Repository, @Service, @Controller*
SpringMVC能够创建对象, 放入到容器中(SpringMVC容器), springmvc容器中放的是控制器对象,</bean>
我们要做的是 使用@Contorller创建控制器对象, 把对象放入到springmvc容器中, 把创建的对象作为控制器使用
这个控制器对象能接收用户的请求, 显示处理结果,就当做是一个servlet使用。
使用@Controller注解创建的是一个普通类的对象, 不是Servlet。 springmvc赋予了控制器对象一些额外的功能。
web开发底层是servlet, springmvc中有一个对象是Servlet : DispatherServlet(中央调度器)
DispatherServlet: 负责接收用户的所有请求, 用户把请求给了DispatherServlet, 之后DispatherServlet把请求转发给
我们的Controller对象, 最后是Controller对象处理请求。
index.jsp-----DispatherServlet(Servlet)----转发,分配给---Controller对象(@Controller注解创建的对象)
main.jsp MainController
addUser.jsp UserController
springmvc请求的处理流程
1)发起some.do
2)tomcat(web.xml--url-pattern知道 *.do的请求给DispatcherServlet)
3)DispatcherServlet(根据springmvc.xml配置知道 some.do---doSome())
4)DispatcherServlet把some.do转发个MyController.doSome()方法
5)框架执行doSome()把得到ModelAndView进行处理, 转发到show.jsp
上面的过程简化的方式
some.do---DispatcherServlet---MyController
springmvc执行过程源代码分析
tomcat启动,创建容器的过程
通过load-on-start标签指定的1,创建DisaptcherServlet对象,
DisaptcherServlet它的父类是继承HttpServlet的, 它是一个serlvet, 在被创建时,会执行init()方法。
在init()方法中
//创建容器,读取配置文件
WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key, ctx);上面创建容器作用: 创建@controller注解所在的类的对象, 创建MyController对象,
这个对象放入到 springmvc的容器中, 容器是map , 类似 map.put("myController",MyController对象)
2.请求的处理过程
1)执行servlet的service()
protected void service(HttpServletRequest request, HttpServletResponse response) protected void doService(HttpServletRequest request, HttpServletResponse response) DispatcherServlet.doDispatch(request, response){ 调用MyController的.doSome()方法 }
doDispatch:springmvc中DispatcherServlet的核心方法, 所有的请求都在这个方法中完成的
分享平时学习心得及见解,还有学习笔记