SpringMVC01

  • SpringMVC 的基本概念
    SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架
    服务器端 三层架构:表现层SpringMVC、业务层spring、持久层mybatis
    MVC 设计模型:Model:Javabean、View:JSP、Controller:servlet
    通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。
    在这里插入图片描述
  • Spring MVC 是基于方法设计的,单例,而 Struts2 是基于类,多例,Struts2 每次执行都会创建一个动作类。所以Spring MVC 会稍微比 Struts2 快些。
    共同点:
    它们都是表现层框架,都是基于 MVC 模型编写的。
    它们的底层都离不开原始 ServletAPI。
    它们处理请求的机制都是一个核心控制器
    区别:
    Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
    Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所以 Spring MVC 会稍微比 Struts2 快些。
    Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便。
    Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率并没有比 JSTL 提升,尤其是 struts2 的表单标签,远没有 html 执行效率高。

搭建环境 程序编写
下载插件加键值对解决maven项目创建过慢问题 archetypeCatalog internal

步骤流程:
1、启动服务器,加载配置文件
DispatcherServlet对象被创建
springmvc.xml文件加载
HelloController创建成对象
2、 发送请求,后台处理请求
在这里插入图片描述
入门案例
pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <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>
    <!-- 配置初始化参数,用于读取 SpringMVC 的配置文件 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 配置 servlet 的对象的创建时间点:应用加载时创建。取值只能是非 0 正整数,表示启动顺序 -->
    <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>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

  • spring mvc 的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.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>

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


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

</beans>
  • 实现方法配置
// 控制器类
@Controller
@RequestMapping(path="/user")
public class HelloController {

    /**
     * 入门案例
     * @return
     */
    @RequestMapping(path="/hello")
    public String sayHello(){
        System.out.println("Hello StringMVC");
        return "success";
    }

    /**
     * RequestMapping注解
     * @return
     */
    @RequestMapping(value="/testRequestMapping",params = {"username=heihei"},headers = {"Accept"})
    public String testRequestMapping(){
        System.out.println("测试RequestMapping注解...");
        return "success";
    }

}

DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。
HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
Handler:处理器
HandlAdapter:处理器适配器
View Resolver:视图解析器
View:视图
mvc:annotation-driven说明:使 用 mvc:annotation-driven 自动加载 RequestMappingHandlerMapping (处理映射器) 和
RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用mvc:annotation-driven替代注解处理器和适配器的配置。

  • RequestMapping注解:用于建立请求 URL 和处理请求方法之间的对应关系。

RequestMapping的属性:path 指定请求路径的url
value value属性和path属性是一样的
mthod 指定该方法的请求方式 get,post
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样
headers:用于指定限制请求消息头的条件
在这里插入图片描述
在这里插入图片描述

  • 请求参数的绑定
    表单中请求参数都是基于 key=value 的。SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。

  • 支持的数据类型:基本类型参数、POJO 类型参数、数组和集合类型参数
    *基本类型或者 String 类型:*要求参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
    POJO 类型,或者它的关联对象:要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
    集合类型有两种方式:集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。/接收的请求参数是 json 格式数据。需要借助一个注解实现。

jsp 代码:
<!-- 基本类型示例 --> 
<a href="account/findAccount?accountId=10&accountName=zhangsan">查询账户</a>

控制器代码:
@RequestMapping("/findAccount")
public String findAccount(Integer accountId,String accountName) {
	System.out.println("查询了账户。。。。"+accountId+","+accountName);
	return "success";
}
实体类代码:

public class Account implements Serializable {
	private Integer id;
	private String name;
	private Float money;
	private Address address;
	//getters and setters
}

public class Address implements Serializable {
	private String provinceName;
	private String cityName;
	//getters and setters
}

jsp 代码:
<!-- pojo 类型演示 -->
<form action="account/saveAccount" method="post">
	账户名称:<input type="text" name="name" ><br/>
	账户金额:<input type="text" name="money" ><br/>
	账户省份:<input type="text" name="address.provinceName" ><br/>
	账户城市:<input type="text" name="address.cityName" ><br/>
	<input type="submit" value="保存">
</form>

控制器代码:
@RequestMapping("/saveAccount")
public String saveAccount(Account account) {
	System.out.println("保存了账户。。。。"+account);
	return "success";
 }
实体类代码:
public class User implements Serializable {
private String username;
private String password;
private Integer age;
private List<Account> accounts;
private Map<String,Account> accountMap;
//getters and setters
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", age="
+ age + ",\n accounts=" + accounts
+ ",\n accountMap=" + accountMap + "]";
} 
}

jsp 代码:
<!-- POJO 类包含集合类型演示 --> 
<form action="account/updateAccount" method="post">
	用户名称:<input type="text" name="username" ><br/>
	用户密码:<input type="password" name="password" ><br/>
	用户年龄:<input type="text" name="age" ><br/>
	账户 1 名称:<input type="text" name="accounts[0].name" ><br/>
	账户 1 金额:<input type="text" name="accounts[0].money" ><br/>
	账户 2 名称:<input type="text" name="accounts[1].name" ><br/>
	账户 2 金额:<input type="text" name="accounts[1].money" ><br/>
	账户 3 名称:<input type="text" name="accountMap['one'].name" ><br/>
	账户 3 金额:<input type="text" name="accountMap['one'].money" ><br/>
	账户 4 名称:<input type="text" name="accountMap['two'].name" ><br/>
	账户 4 金额:<input type="text" name="accountMap['two'].money" ><br/>
	<input type="submit" value="保存">
</form>

控制器代码:
@RequestMapping("/updateAccount")
public String updateAccount(User user) {
	System.out.println("更新了账户。。。。"+user);
	return "success"; 
}
  • 中文乱码问题
<!--配置解决中文乱码的过滤器-->
  <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>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

自定义类型转换器

@RequestMapping("/deleteAccount")
public String deleteAccount(Date date) {
	System.out.println("删除了账户。。。。"+date);
	return "success";
}
//第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。
public interface Converter<S, T> {//S:表示接受的类型,T:表示目标类型
	@Nullable
	T convert(S source);
}

public class StringToDateConverter implements Converter<String, Date> {
/**
* 用于把 String 类型转成日期类型
*/
	@Override
	public Date convert(String source) {
		DateFormat format = null;
		try {
			if(StringUtils.isEmpty(source)) {
			throw new NullPointerException("请输入要转换的日期");
		}
		format = new SimpleDateFormat("yyyy-MM-dd");
		Date date = format.parse(source);
		return date;
		} catch (Exception e) {
			throw new RuntimeException("输入日期有误");
			}
		 }
}
//第二步:在 spring 配置文件中配置类型转换器。spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去
<!-- 配置类型转换器工厂 --> 
<bean id="converterService"
	class="org.springframework.context.support.ConversionServiceFactoryBean">
	<!-- 给工厂注入一个新的类型转换器 -->
	 <property name="converters">
 	<array>
		 <!-- 配置自定义类型转换器 -->
 		<bean class="com.itheima.web.converter.StringToDateConverter"></bean>
 	</array>
 	</property>
</bean>
//第三步:在 annotation-driven 标签中引用配置的类型转换服务 
<!-- 引用自定义类型转换器 --> 
<mvc:annotation-drivenconversion-service="converterService"></mvc:annotation-driven>
  • 使用 ServletAPI 对象作为方法参数
@RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response){
        System.out.println("执行了...");
        System.out.println(request);

        HttpSession session = request.getSession();
        System.out.println(session);

        ServletContext servletContext = session.getServletContext();
        System.out.println(servletContext);

        System.out.println(response);
        return "success";
    }
  • 常用注解

RequestParam 把请求中指定名称的参数给控制器中的形参赋值。

<a href="springmvc/useRequestParam?name=test">requestParam 注解</a>

@RequestMapping("/useRequestParam")
 public String useRequestParam(@RequestParam("name")String username,
								@RequestParam(value="age",required=false)Integer age){
	System.out.println(username+","+age);
	return "success"; 
}

RequestBody 用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。get 请求方式不适用。

<form action="anno/testRequestBody" method="post">
        用户姓名:<input type="text" name="username" /><br/>
        用户年龄:<input type="text" name="age" /><br/>
        <input type="submit" value="提交" />
 </form>
 
 @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body){
        System.out.println("执行了...");
        System.out.println(body);
        return "success";
    }

PathVariable注解:用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。

<a href="springmvc/usePathVariable/100">pathVariable 注解</a>

@RequestMapping("/usePathVariable/{id}")
 public String usePathVariable(@PathVariable("id") Integer id){
	System.out.println(id);
	return "success";
 }
  • REST 风格 URL 请求的路径相同,根据不同的请求方式选择要执行的方法
<form action="springmvc/testRestPOST" method="post">
	用户名称:<input type="text" name="username"><br/>
	<!-- <input type="hidden" name="_method" value=**"POST"**> --> 
	<input type="submit" value="保存">
</form>

<form action="springmvc/testRestPUT/1" method="post">
	用户名称:<input type="text" name="username"><br/>
	<input type="hidden" name="_method" value=**"PUT**"> 
	<input type="submit" value="更新">
</form>

@RequestMapping(value="/testRestPOST",method=RequestMethod.POST)
 public String testRestfulURLPOST(User user){
	System.out.println("rest post"+user);
	return "success"; 
}

@RequestMapping(value="/testRestPUT/{id}",method=RequestMethod.PUT)
 public String testRestfulURLPUT(@PathVariable("id")Integer id,User user){
	System.out.println("rest put "+id+","+user);
	return "success";
 }

RequestHeader 用于获取请求消息头。

@RequestMapping("/useRequestHeader")
 public String useRequestHeader(@RequestHeader(value="Accept-Language",
 								required=false)String requestHeader){
	System.out.println(requestHeader);
	return "success"; 
}

CookieValue 用于把指定 cookie 名称的值传入控制器方法参数。

/**
     * 获取Cookie的值
     * @return
     */
    @RequestMapping(value="/testCookieValue")
    public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
        System.out.println("执行了...");
        System.out.println(cookieValue);
        return "success";
    }

ModelAttribute:出现在方法上,表示当前方法会在控制器的方法执行之前,先执行
它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。出现在参数上,获取指定的数据给参数赋值。

<form action="anno/testModelAttribute" method="post">
        用户姓名:<input type="text" name="uname" /><br/>
        用户年龄:<input type="text" name="age" /><br/>
        <input type="submit" value="提交" />
 </form>

	@RequestMapping(value="/testModelAttribute")
    public String testModelAttribute(@ModelAttribute("abc") User user){
        System.out.println("testModelAttribute执行了...");
        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...");
        // 底层会存储到request域对象中
        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="/delSessionAttributes")
    public String delSessionAttributes(SessionStatus status){
        System.out.println("getSessionAttributes...");
        status.setComplete();
        return "success";
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值