小言_互联网的博客

SpringMVC 初识 (1/3)

378人阅读  评论(0)

一些三层架构的介绍,我就不谈了

1、SpringMVC 和 Struts2 的优劣分析

⛳️共同点:

​ 他们都是表现层框架,都是基于MVC模型编写的。
​ 他们的底层都离不开原始的 ServletAPI
​ 他们处理请求的机制都是一个核心控制器

⛳️区别:

​ Spring MVC 的入口是 Servlet ,而 Struts2 是 Filiter
​ Spring MVC 的基于方法设计的,而 Struts2 是基于类, Struts2 每次执行都会创建一个动作类。 所以 Spring MVC 会稍微比 Struts2 快些
​ Spring MVC 使用更加简洁,同时还支持 JSR303,处理 ajax 的请求更方便
(JSR 303 是一套 JavaBean 参数校验标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,就可以在需要验证的时候进行校验)
​ Struts2 的OGNL 的表达式使页面开发效率相比 Spring MVC 更高些,但执行效率并没有 JSTL 提升,尤其是 struts2 的表单标签,远没有 html 执行效率高

2、搭建 SpringMVC 项目

配置pom.xml

  <properties>
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>
<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
</dependencies>

配置 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>
</web-app>

在 resources 包里创建 springmvc.xml

<?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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 开启注解扫描 -->
    <context:component-scan base-package="cn.itcast"/>

    <!-- 视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 开启 SpringMVC 框架注解的支持 -->
    <mvc:annotation-driven/>
</beans>

写 HelloController类

package cn.itcast.controller;

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

/**
 * @Author: Array
 * @Date: 2020/5/13 15:27
 */
@Controller
public class HelloController {

    @RequestMapping(path = "/hello")
    public String sayHello(){
        System.out.println("hello StringMVC");
        return null;
    }
}

3、配置完之后,运行

服务器一打开,我们先是进入到 webapp 下面的 index.jsp 里, 我们的 a 标签 指向 /hello 通过我们的 web.xml 的配置 找到 注解过@Controller 的 HelloController 控制器类 里的 @RequestMapping(path = “/hello”) 终端先输出一句我们写的 System.out 在 return “success”; 再通过视图解析器 ⬇️

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

找到 /WEB-INF/pages/ 下面的 jsp 文件,因为返回的是 success 所以找的是 /WEB-INF/pages/success.jsp ✴️ 完美 🥀 入门

4、📕 详解

1、启动服务器,加载一些配置文件
DispatcherServlet 对象创建
springmvc.xml 被加载
HelloController 对象被创建

2、发送请求后台处理请求
➡️ DispatcherServlet
控制作用,控制中心
⬇️ ↖️
⬇️ ↖️
⬇️ ↖️ RequestMapping(path = “/hello”)

success.jsp 👉 结果

@RequestMapping
参数:
value: 指定位置
path: 指定位置
method : 提交方式, method = {RequestMethod.POST} 这样的话,提交必须为post,否则不进类
params: 参数,需要提交大阔里相对的参数,才能进这个方法,如果参数后面跟了值,这时候也必须要一样才行

SpringMVC会自动帮我们封装数据,只需要前端name 的值与 封装属性一直,就会帮我们自动封装

自定义转换器

<!-- 配置自定义类型转换器 -->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters" >
            <set>
                <bean class="cn.itcast.utils.ToDateConverter"/>
            </set>
        </property>
    </bean>

<!-- 开启 SpringMVC 框架注解的支持 -->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>

别忘了在 SpringMVC 框架注解支持那 加 conversion-service="conversionServiceFactoryBean"

还可以获取元素的 Servlet

public String testServlet(HttpServletRequest request, HttpServletResponse response){
    return "success";
}

@RequestBody 获取主体,后面ajax有用

@RequestMapping(value = "/testRequestBody")
public String testRequestBody(@RequestBody String body){
    System.out.println("执行了... "+body);
    return "success";
}

@PathVariable restful 编程风格

@RequestMapping(value = "/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name = "sid") String id){
    System.out.println("执行了... "+id);
    return "success";
}

前端字需要 就可以了
吧 {sid} 占位符 里的值 拿给 id 输出出来

@RequestHeader 获取头部信息

@RequestMapping(value = "/RequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
    System.out.println("执行了... "+header);
    return "success";
}

前端 :
获取到的 :text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9

@CookieValue 获取 Cookie值

@RequestMapping(value = "/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue){
    System.out.println("执行了... "+cookieValue);
    return "success";
}

获取的是 JSESSION 值

@ModelAttribute

@RequestMapping(value = "/testModelAttribyute")
public String testModelAttribyute(){
    System.out.println("执行了... ");
    return "success";
}

@ModelAttribute
public void showUser(){
    System.out.println("优先执行.....");
}

此注解写在方法上,调用后,会优先执行此方法, 应用场景:当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用默认数据

第一种写法

@RequestMapping(value = "/testModelAttribyute")
public String testModelAttribyute(User user){
    System.out.println("执行了... ");
    System.out.println(user);
    return "success";
}

@ModelAttribute
public User showUser(String uname){
    System.out.println("showUser 执行了.....");
    // 通过用户名查询数据库()
    User user = new User();
    user.setUname(uname);
    user.setAge(20);
    user.setDate(new Date());
    return  user;
}

第二种写法

@RequestMapping(value = "/testModelAttribyute")
public String testModelAttribyute(@ModelAttribute(value = "abc") User user){
    System.out.println("执行了... ");
    System.out.println(user);
    return "success";
}

@ModelAttribute
public void showUser(String uname, Map<String,User> map){
    System.out.println("showUser 执行了.....");
    // 通过用户名查询数据库()
    User user = new User();
    user.setUname(uname);
    user.setAge(20);
    user.setDate(new Date());
    map.put("abc",user);
}

@SessionAttribute 用于多次执行控制器方法间的参数共享。​

要在类上面加这个 @SessionAttributes(value = {“msg”}) 相当于 把msg放到session域中

@RequestMapping(value = "/testSessionAttributes")
public String testSessionAttributes(Model model){
    System.out.println("testSessionAttributes... ");
    model.addAttribute("msg","美美");
    return "success";
}

@RequestMapping(value = "/getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
    System.out.println("getSessionAttributes... ");
    String msg = (String)modelMap.get("msg");
    System.out.println(msg);
    return "success";
}

@RequestMapping(value = "/deleteSessionAttributes")
public String deleteSessionAttributes(SessionStatus status){
    System.out.println("getSessionAttributes... ");
    status.setComplete();
    return "success";
}

第一个是测试,第二个是放进session域中,并取值,第三个是删除


转载:https://blog.csdn.net/qq_39550368/article/details/106161663
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场