随笔- 23  文章- 0  评论- 0  阅读- 1892 

运行原理

DispatcherServlet通过HandlerMapping在MVC的容器中找到处理请求的Controller,将请求提交给Controller,Controller对象调用业务层接口实现对应业务,并得到处理结果,返回ModelAndView,DispatcherServlet通过查找最适合的ViewResolver完成视图解析,完成HTTP响应

启动流程

ContextLoaderListener初始化,实例化IoC容器,并将此容器实例注册到ServletContext中,DispatcherServlet初始化。

DispatcherServlet配置

1.由Servlet拦截所有请求并发给Spring MVC控制器

在\webapp\WEB-INF\web.xml:

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
                        <!-- 配置文件位置 -->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
            <!-- 拦截所有的请求 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
                        <!-- 将字符编码为UTF-8-->
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

备注:web.xml文件并不是web工程必须的,web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等

classpath:springmvc.xml

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>
<!--配置视图映射器,这样直接返回字符串形式的.jsp的文件名即可-->

    <context:component-scan base-package="com"/><!--配置扫描范围-->

    <mvc:annotation-driven/><!--开启mvc的注解模式-->

	 <!-- 3.配置InternalResourceViewResolver -->
	 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	 	<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
	 	<property name="prefix" value="/WEB-INF/jsp/" />
	 	<property name="suffix" value=".jsp" />
	 </bean>
</beans>
ModelAndView对象

流程图

image-20200822223201901

注解扫描:

//在springBoot中,Controller的扫描范围默认同一个包内,包内的返回值将通过视图解析器解析
@Controller

//直接返回结果
@ResponceBody

@RestController=@ResponceBody+@Controller

webapp/web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1" metadata-complete="true">
	<!-- 如果是用mvn命令生成的xml,需要修改servlet版本为3.1 -->
	<!-- 配置DispatcherServlet -->
	<servlet>
		<servlet-name>mvc-dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 配置springMVC需要加载的配置文件
			spring-dao.xml,spring-service.xml,spring-web.xml
			Mybatis - > spring -> springmvc
		 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/spring-*.xml</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>mvc-dispatcher</servlet-name>
		<!-- 默认匹配所有的请求 -->
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

@RequestParam与@PathVariable的区别

使用@RequestParam时,通过get方法提交时,URL是这样的host/path?id=1,通过表单提交时name属性需要和控制器中@RequestParam中的value属性值相同

使用@PathVariable时,URL是host/path/1

@RequestMapping(value="/user",method = RequestMethod.GET)  
   public @ResponseBody  
   User printUser(@RequestParam(value = "id", required = false, defaultValue = "0")  
   int id) {  
    User user = new User();  
       user = userService.getUserById(id);  
       return user;  
   }  
     
   @RequestMapping(value="/user/{id:\\d+}",method = RequestMethod.GET)  
   public @ResponseBody  
   User printUser2(@PathVariable int id) {  
       User user = new User();  
       user = userService.getUserById(id);  
       return user;  
   }  

将Controller的数据提交到页面

使用HttpServletRequest对象里的setAttribute方法将值回传html或者JSP页面中

@GetMapping("/")
public String test(HttpServletRequest request){
    request.setAttribute();
    return "";
}

使用Model或者Map<Object, String>的方式保存参数

@GetMapping("/")
public String test(Model model){
    model.addAttribute();
    return "";
}

或者使用ModelAndView的方式

@GetMapping("/")
public ModelAndView test(){
    ModelAndView mav = new ModelAndView();
    mav.addObject();
    return mav;
}
 posted on   春秋流千事  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示