mvc架构

什么是springmvc框架****
MVC架构它是一个编程思想,把程序划分成三部分。Model模型层 View视图层 Controller控制层

什么是springmvc框架
springmvc框架就是按照上面三层架构的思想设计的一款框架。springmvc的主要作用: :接收浏览器的请求数据,对数据进行处理,然后返回页面进行显示 类似: servlet。
为什么使用springmvc框架

springmvc:自动接受参数,自动响应客户的一款框架。
如何使用springmvc框架。
1 创建一个maven的web工程。

2 添加依赖

    <!--springmvc的依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.15.RELEASE</version>
    </dependency>

3 springmvc配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--controller层包的扫描-->
    <context:component-scan base-package="com.ykq.controller"/>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/views/"/>
            <!--后缀-->
            <property name="suffix" value=".jsp"/>
    </bean>
</beans>

4 controller类的编写

@Controller  //表示该类为控制层类。
public class HelloController {


    @RequestMapping("/index") // 请求路径/index路径映射到该方法上。
    public String index(){
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~index~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        return "index"; //经过视图解析器解析。 /views/index.jsp
    }
    @RequestMapping("/main")
    public String main(){
        System.out.println("~~~~~~~~~~~~~~~~~~~~~main~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        return "main"; //经过视图解析器解析。 /views/main.jsp
    }
}

5 注册公共servlet--DispatcherServlet

<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
         version="4.0">
    
    <!--注册公共servlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--读取springmvc配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--任何路径都会经过公共servlet-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>


流程

 *     1. 客户端发送请求http://localhost:8080/aaa
 *     2. 来到tomcat服务器。
 *     3. springmvc的前端控制器DipatcherServlet接受所有的请求。
 *     4. 查看你的请求地址和哪个@RequestMaping匹配。
 *     5. 执行对应的方法。方法会返回一个字符串。    
 *     6. springmvc把该字符串解析【视图解析器】为要转发的网页。把该字符串经过视图解析器拼接。/prefix/字符串.后缀
 *     7. 拿到拼接的地址,找到对应的网页。
 *     8. 渲染该网页给客户

springmvc接受参数
1 接受少量参数
比如:删除操作。只传入id值。

2 传递大量参数
比如:注册和修改功能。需要传递表单的整个数据。这是如果在一一的设置方法参数就比较麻烦了。我们应该封装一个实体类用来接受表单提交的数据。

3 解决接受参数的乱码问题
设置请求的编码类型。必须使用过滤器。可以自己定义过滤器也可以使用springmvc自带的过滤器。
自定义编码过滤器

package com.ykq.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @Author: 闫克起
 * @Description:
 * @Date: Create in 11:14 2024/10/8
 */
@WebFilter(urlPatterns = "/*")
public class EncodingFiler implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("~~~~~~~~~~~~~~");
    }

    @Override
    public void destroy() {
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletResponse.setCharacterEncoding("utf-8");
        servletRequest.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest,servletResponse);//放行
    }
}

使用springmvc自带的过滤器
CharacterEncodingFilter

    <!--注册编码过滤器-->
    <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>
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

4 解决接受日期类型的数据

解决办法:
第一步: 开启springmvc注解驱动

第二步: 使用日期格式化注解

处理静态资源
什么才是静态资源: 比如: css, js , images等这些称为静态资源。

放行静态资源。凡是静态资源无需经过前端控制器DispatcherServlet

springmvc如何响应数据?
原来servlet保存数据,都在四大域中保存。pageContext, request,session,application. springmvc控制层中如何保存数据。它也可以保存在request,session. 它也可以保存自己提供的类对象中。

package com.ykq.controller;

import com.ykq.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * @Author: 闫克起
 * @Description:
 * @Date: Create in 16:06 2024/10/8
 */
@Controller
@SessionAttributes({"name4"}) //在model中保存的数据指定name4的范围为session的范围。
public class Hello2Controller {
    //保存到Request对象中.
    @RequestMapping("/a")
    public String a(HttpServletRequest request){
         request.setAttribute("name","张三");
         return "a";//转发跳转
    }
    //上面这种方式采用的还是HttpServletRequest保存的, 但是这种模式必须依赖servlet的jar. 如果不想依赖servlet的jar,则可以
    //使用springmvc提供的对象用来保存。Model对象。
    @RequestMapping("/b")
    public String b(Model model){
        model.addAttribute("name2","李四"); //model保存数据的周期默认和request一样。
        return "a";
    }

    //保存数据到session中。
    @RequestMapping("/c")
    public String c(HttpSession session){
        session.setAttribute("name3","王五");
        return "a";
    }
    //上面保存session中的数据采用的还是servlet中session。如果我们不想依赖servlet的jar。则springmvc也提供了存放范围类似session.
    @RequestMapping("/d")
    public String d(Model model){
        User user=new User();
        user.setName("刘德华");
        user.setAddress("香港");
        model.addAttribute("name4",user);
        return "a";
    }
}

页面跳转时无需经过springmvc视图解析器。
forward:/路径 或者 redirect:/路径 当springmvc看到forward和redirect关键字时,无需经过视图解析器。

   @RequestMapping("/f")
    public String f(){
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~");
//        return "forward:/a.jsp"; //转发跳转到a.jsp 无需经过视图解析器
        return "redirect:/a.jsp"; //重定向跳转到a.jsp 无需经过视图解析器
    }

springmvc零散的内容
@RestController作用等价于@Controller+@ResponseBody的合体

@GetMapping: 请求方式必须为get请求。适合查询操作。

@PostMapping:适合添加操作

@PutMapping: 修改操作

@DeleteMapping:删除操作。

posted on 2024-12-24 18:58  小木不痞  阅读(134)  评论(0)    收藏  举报

导航