首页 > 其他分享 >2022-09-22 第二小组 张晟源(SpringMVC)

2022-09-22 第二小组 张晟源(SpringMVC)

时间:2022-09-24 11:57:19浏览次数:52  
标签:22 SpringMVC 09 视图 -- Controller ModelAndView servlet

SpringMVC

SpringMVC

SpringMVC是Spring内置的MVC框架,他的MVC模式(Model-View-Controller):解决页面代码和后台代码的分离。

SpringMVC原理

在没有使用SpringMVC之前我们都是使用Servlet在做Web开发。但是使用Servlet开发在接收请求参数,数据共享,页面跳转等操作相对比较复杂。servlet是java进行web开发的标准,既然springMVC是对servlet的封装,那么很显然SpringMVC底层就是Servlet,SpringMVC就是对Servlet进行深层次的封装。

SpringMVC执行流程和原理

Handler:处理器

Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具

体的用户请求进行处理,由于Handler涉及到具体用户业务请求,所以一般情况下Handler是由我们程序

员来进行开发的。实际上Handler就是我们开发的Controller。

View:视图

一般情况下需要通过页面的标签或页面模板技术展示给客户,需要由程序员根据业务需求开发具体的页

面。就是我们写的HTML,JSP

DispatcherServlet:中央控制器

用户请求到达前端控制器,它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的核心。

由它来调用其他组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。

类似于门卫传达室,一个请求来的时候先去门卫,一步步来处理问题,就是个servlet。

HandlerMapping:处理器映射器

HandleMapping负责根据用户请求url找到Handler处理器,springmvc提供了不同的映射器实现不同的

映射方式,如配置文件方式,实现接口的方式,注解方式。

实际上,就是Map,放了一堆数据,key是url,value是你对应的处理器,一个请求来了,嗲用

map.get(url)就知道是哪个类的哪个方法来处理这个请求,实际上将这个url对应的拦截器,处理器

都拿到。

HandlerAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这里适配器模式的应用,通过扩展适配器可以对更多类型的的

处理器进行执行。

实际上,这货会调用对应的方法,生成最终的ModelAndView。

ViewResolver:视图解析器

ViewResolver负责将处理结果生成View视图,ViewResolver根据逻辑视图名解析成物理视图名即具体的

页面的地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给客户。

实际上就是解析ModelandView,拼接字符串,给你加个前缀,再加个后缀,让你能够找到对应的

视图地址。(很少用)

 

创建SpringMVC项目(配置版)

--用Maven创建项目,pom.xml修改打包方式为war包

<!-- 修改打包方式为war -->
    <packaging>war</packaging>

--添加spring-webmvc依赖

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.22</version>
        </dependency>
    </dependencies>

--添加servlet依赖

因为springmvc底层还是servlet,所以还必须添加serlvet依赖。

<!-- servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>

--添加jsp

<!-- jsp -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
    <scope>provided</scope>
</dependency>

--web.xml配置欢迎页

<welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>login.html</welcome-file>
    </welcome-file-list>

--想用SpringMVC,需要注册dispatcherServlet

<!-- 如果想要使用SpringMVC,就必须注册dispatcherServlet -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 加载springmvc的配置文件 -->
        <!--
            springmvc的默认配置文件的扫描路径和文件名:
            1、默认的路径:WEB-INF/
            2、默认的文件名: <servlet-name>-servlet.xml
            放在resource下
        -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:app-context.xml</param-value>
        </init-param>
        <!-- 启动web容器就加载springmvc -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

--app-context.xml

<!-- 中央适配器:DispatcherServlet -->
    <!-- 处理映射器 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    <!-- 处理器适配器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <!-- WEB-INF下加密路径,请求转发 -->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

--创建Controller

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UsrControllers implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView modelAndView = new ModelAndView();

        // 视图,页面,视图名,视图解析器
        modelAndView.setViewName("success");

        // 设置一个模型,往request作用域中添加数据,获取的话要用jsp
        modelAndView.addObject("username","admin");
        
        return modelAndView;
    }
}

--index.jsp

<h1>Hello SpringMVC!!!</h1>
<a href="user">UserController</a>
<br>
<a href="user/showUser">showUser</a>

<form action="user/login" method="post">
    <p>
        账号:<input type="text" name="username">
    </p>
    <p>
        密码:<input type="password" name="password">
    </p>
    <p>
        <input type="submit" value="提交">
    </p>
</form>

--WEB-INF下创建pages文件夹,创建success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>Success Page!!!</h1>
    welcome:${requestScope.username}
<hr>
    用户名:${requestScope.user.username}
    密码:${requestScope.user.password}
<hr>
    从session中获取的用户名:${sessionScope.username}
</body>
</html>

--注册Controller

    <!-- 注册UserController -->
 <bean id="/user" class="com.jsoft.controller.UserController"></bean>

 

SpringMVC项目(注解版)

--springmvc配置文件开启文件扫描

    <!-- 开启spring注解扫描:Controller,service -->
    <context:component-scan base-package="com.jsoft"></context:component-scan>

    <!-- 开启springmvc的注解扫描 -->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!-- 中央适配器:DispatcherServlet -->
    <!-- 处理映射器 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    <!-- 处理器适配器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <!-- WEB-INF下加密路径,请求转发 -->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!-- 注册UserController -->
<!--    <bean id="/user" class="com.jsoft.controller.UserController"></bean>-->

 --Controller

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class UsrControllers {

    // 设置处理那个请求,springmvc的注解
    @RequestMapping("/user")
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView modelAndView = new ModelAndView();

        // 视图,页面,视图名,视图解析器
        modelAndView.setViewName("success");

        // 设置一个模型,往request作用域中添加数据,获取的话要用jsp
        modelAndView.addObject("username","admin");

        return modelAndView;
    }
}

--视图和模型:不应该放在一块。
*   视图和模型都耦合给了ModelAndView对象,必须说我只想跳视图。
*
*   模型和视图分离!!!

@Controller
@RequestMapping("user")
public class UsrControllers {
@RequestMapping(value = "showUser",method = RequestMethod.GET)
    //@RequestMapping(value = "?howUser",method = RequestMethod.GET)
    //@RequestMapping(value = "*howUser",method = RequestMethod.GET)
//    @GetMapping("showUser")
    public String showUser(Model model) {

        // 操作模型,把数据添加到request作用域
        model.addAttribute("username","张三");

        // 操作视图
        return "success";

    }
}
<h1>Hello SpringMVC!!!</h1>
<a href="user">UserController</a>
<br>
<a href="user/showUser">showUser</a>

 --配置字符集

<!-- 注册springmvc自带的字符集的过滤器 -->
<filter>
    <filter-name>encodingFilter</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>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:22,SpringMVC,09,视图,--,Controller,ModelAndView,servlet
From: https://www.cnblogs.com/shenmimao/p/16720931.html

相关文章