springMvcDemo01基本知识点&入门案例&常用注解

一:基本知识点

  1. SpringMVC
    a) SpringMVC是一种基于java的实现MVC涉及模型的请求驱动类型的轻量级web框架,它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
    b) SpringMVC在三层架构的位置
    在这里插入图片描述

c) 优势清晰的角色划分
i. 前端控制器 DispatcherServlet:用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
ii. 请求到处理器映射HandlerMapper:HandlerMapper根据用户请求找到Handler,springMVC提供了不同映射器实现不同的映射方式。
iii. 处理器适配器HandlerAdapter
iv. 视图解析器 ViewResolver
v. 处理器或页面控制器 Controller
vi. 验证器Validator
vii. 命令对象 Command
viii. 表单对象
d) SpringMVC和Struts的优略分析
i. 共同点
1. 他们都是表现层架构,都是基于MVC模型编写的
2. 他们的底层都离不开原始ServletAPI
3. 他们处理请求的机制都是一个核心控制器
ii. 区别
1. SpringMVC的入门是Servlet,而Struts2是Filter
2. Spring MVC是基于方法涉及的,而Struts是基于类,Struts2每次执行都会创建一个动作类。所以Spring MVC比Struts快些。
3. Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便
4. Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率并没有比 JSTL 提 升,尤其是 struts2 的表单标签,远没有 html 执行效率高。
二:入门案例
目录结构图
在这里插入图片描述

1. 导入maven坐标
 	<artifactId>junit</artifactId>
 	<artifactId>spring-context</artifactId>
  	<artifactId>spring-web</artifactId>
    <artifactId>spring-webmvc</artifactId>
    <artifactId>servlet-api</artifactId>
2.index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>lml</title>
</head>
<body>
    <h3>开始的测试</h3>
    <a href="lml/hello">超链接</a>
    </br>
    </body>
</html>

3.java文件

@Controller("one")
@RequestMapping("lml")
public class one {
    
    
    @RequestMapping("/hello")
    public String hello(){
    
    
        System.out.println("测试开始了");
        return "success";
    }

4.resources 下springMvc.xml

<?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">
            <!-- 配置创建 spring 容器要扫描的包 -->
    <context:component-scan base-package="lml"></context:component-scan>
    <!-- 配置类型转换器工厂 -->
   <!-- 第二步:在 spring 配置文件中配置类型转换器。-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="lml.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

    <!-- 配置视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--文件所在的目录-->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!--文件的后缀名-->
        <property name="suffix" value=".jsp"></property>
    </bean>
    <mvc:annotation-driven/>

  1. webapp->WEB-INF->pages->success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        <h4>成功了</h4>
</body>
</html>
  1. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">
  <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 的对象的创建时间点,应用加载时创建,取值只能时非0正整数,表示启动顺序-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!--所有的都要拦截-->
  <servlet-mapping>
    <servlet-name>springMVC</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>
    <!-- 启动过滤器 解决中文乱码 -->
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

分析过程
在这里插入图片描述

三:常用注解
1. RequestMapping:属性method,params
2. RequestParam:把请求指定名称的参数给控制器中的形参赋值在这里插入代码片
3. RequestBody:用于获得请求体的内容
4. PathVaribale:用于绑定url中的占位符
5. RequestHeader:用于获取请求消息头
6. CookieValue:用于把指定cookie名称的值传入控制器方法参数
7. ModelAtrtribute:用于修饰方法(表示当前方法会在控制器的方法之前先执行)和参数(获取指定的数据给参数赋值)。
8. SessionAttribute:用于多次执行控制器方法间的参数共享

@Controller
@RequestMapping("l")
@SessionAttributes(value ={
    
    "username","password"},types={
    
    Integer.class})
public class two2 {
    
    
    @RequestMapping("/testRequestParam")
    public String testParams(@RequestParam(name = "name") String uname,@RequestParam(value="age",required=false)Integer age){
    
    
        System.out.println("测试testRequestParam");
        System.out.println(uname+age);
        return "success";
    }
    @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String Body){
    
    
        System.out.println("测试testRequestBody");
        System.out.println(Body);
        return "success";
    }
    @RequestMapping("/testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") Integer id){
    
    
        System.out.println("PathVariable");
        System.out.println(id);
        return "success";
    }
    @RequestMapping("/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value = "Accept-Language") String Accept){
    
    
        System.out.println("RequestHeader");
        System.out.println(Accept);
        return "success";
    }
    @RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String CookieValue){
    
    
        System.out.println("testCookieValue");
        System.out.println(CookieValue);
        return "success";
    }

    /**
     * 被 ModelAttribute 修饰的方法
     * @param
     */
   /* @ModelAttribute
    public void showModel(user user) {
        System.out.println("执行了 showModel 方法"+user.getUname());
    }
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(user user){
        System.out.println("testModelAttribute");
        System.out.println(user.getUname());
        return "success";
    }*/


  /*  @ModelAttribute
    public user showModel(String uname) {
//模拟去数据库查询
        user abc = findUserByName(uname);
        System.out.println("执行了 showModel 方法"+abc);
        return abc;
    }
    private user findUserByName(String uname) {
        user user = new user();
        user.setUname(uname);
        user.setAge(19);
        user.setDate(new Date());
        return user;
    }
    @RequestMapping("/updateUser")
    public String testModelAttributeupdateUser(user user) {
        System.out.println("控制器中处理请求的方法:修改用户:"+user);
        return "success";
    }*/

    /**
     * 基于 Map 的应用场景示例 1:ModelAttribute 修饰方法不带返回值
     * @param uname
     * @return
     */
   /* @ModelAttribute
    public void showModel(String uname, Map<String,user> map) {
//模拟去数据库查询
        user user = findUserByName(uname);
        System.out.println("执行了 showModel 方法"+user);
        map.put("abc",user);
    }
    private user findUserByName(String uname) {
        user user = new user();
        user.setUname(uname);
        user.setAge(19);
        user.setDate(new Date());
        return user;
    }
    @RequestMapping("/testUpdateUser")
    public String testUpdateUser(@ModelAttribute("abc")user user) {
        System.out.println("控制器中处理请求的方法:修改用户:"+user);
        return "success";
    }*/



    @RequestMapping("/testPut")
    public String testPut(Model model){
    
    
        model.addAttribute("username", "泰斯特");
        model.addAttribute("password","123456");
        model.addAttribute("age", 31);
        //跳转之前将数据保存到 username、password 和 age 中,因为注解@SessionAttribute 中有这几个参数
        return "success";

    }

    @RequestMapping("/testGet")
    public String testGet(ModelMap model){
    
    

        System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("age"));
        return "success";
    }

    @RequestMapping("/testClean")
    public String complete(SessionStatus sessionStatus){
    
    
        sessionStatus.setComplete();
        return "success";
    }
}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>常用注解</title>
</head>
<body>
    <a href="l/testRequestParam?name=test">requestParam 注解</a>
    <br/>
    <%--测试Body--%>
    <form action="l/testRequestBody" method="post">
        姓名:<input type="text" name="username"> <br/>
        密码:<input type="text" name="password"> <br/>
        金钱:<input type="text" name="money"> <br/>
        <input type="submit" value="提交">
    </form>
    <br/>
    <a href="l/testPathVariable/10">PathVariable 注解</a>
    <br/>
    <a href="l/testRequestHeader">RequestHeader 注解</a>
    <br/>
    <a href="l/testCookieValue">CookieValue 注解</a>
    <br/>
    <a href="l/testModelAttribute?uname=test">ModelAttribute 注解基于 POJO 属性的基本使用</a>
    <br/>

    <%--需求:
    修改用户信息,要求用户的密码不能修改
    jsp 的代码:--%>
    <!-- 1:ModelAttribute 修饰方法带返回值-->
    <form action="l/updateUser" method="post">
        用户名称:<input type="text" name="uname" ><br/>
        用户年龄:<input type="text" name="age" ><br/>
        <input type="submit" value="保存">
    </form>
    <br/>
    <%--基于 Map 的应用场景示例 1:ModelAttribute 修饰方法不带返回值--%>
    <form action="l/testUpdateUser" method="post">
        用户名称:<input type="text" name="uname" ><br/>
        用户年龄:<input type="text" name="age" ><br/>
        <input type="submit" value="保存">
    </form>


    <!-- SessionAttribute 注解的使用 -->
    <a href="l/testPut">存入 SessionAttribute</a>
    <hr/>
    <a href="l/testGet">取出 SessionAttribute</a>
    <hr/>
    <a href="l/testClean">清除 SessionAttribute</a>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_46809332/article/details/116133981
今日推荐