Log[SpringMVC_01]_20.06.06

第一章 SpringMVC的基本概念

1.1 先导概念

1.1.1 三层架构

1.1.2 MVC设计模型

M:Model 模型 JavaBean(将请求封装到JavaBean,与业务层交互)

V:View 视图 JSP/HTML(响应转发给JSP,展示给用户)

C:Controller 控制器 Servlet(接收请求)

1.2 SpringMVC概述

SpringMVC使Web请求类的编写变得简单,只需要用注解标注,就可以实现之前需要继承HttpServlet、重写方法才能做的事情。

1.2.1 SpringMVC和Struts2的区别

都是表现层框架,基于MVC编写

底层都离不开ServletAPI

处理请求的机制都是一个核心控制器

区别:

SpringMVC的入口是Servlet Struts2是Filter

SpringMVC基于方法设计,是单例的;Struts2是基于类的,是多例的;也是由于这个原因,Struts2每次执行都会创建一个动作类,所以比SpringMVC略慢

第二章 SpringMVC入门

2.1 先导程序示例

需求:用户访问index.jsp页面——>发送请求——>接收处理请求——>转发到成功JSP页面展示给用户

步骤

① 创建maven组件 选择maven-archetype-webapp 完善目录结构 导入jar包

 <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>
  <!--前端控制器-->
  <!--作用是在第一次启动的时候实例化DispatcherServlet对象 这个对象去加载init-param里classpath下的springmvc.xml文件-->
  <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>

③ springmvc.xml(在resources中)

<?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-4.0.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.0.xsd">


    <!--开启注解扫描-->
    <!--扫描到HelloController类的注解,就会把此类的对象放进IOC容器-->
    <context:component-scan base-package="com.stay"/>
    <!--开启SpringMVC注解支持  @RequestMapping注解生效 处理器适配器和处理器映射器自动加载-->
    <mvc:annotation-driven/>
    
    <!--配置视图解析器对象  为成功跳转到jsp页面用-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--路径的value是/WEB-INF/pages/ 表示文件是在pages下 文件后缀是.jsp-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

 

④ 编写控制器类

//控制器类
@Controller  //表明这是一个控制器类
public class HelloController {
    @RequestMapping(path="/hello") //标识访问路径
    public String sayHello(){
        System.out.println("hello springMVC");
        return "success";//默认表示jsp文件的名称
    }
}

⑤index.jsp和 success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>入门程序</h3>
<%注意href中不加 / %>
<a href="hello">入门程序</a>
</body>
</html>


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>跳转成功</h3>
</body>
</html>
整个流程图:

在这里插入图片描述

2.2 @RequestMapping

用来建立请求URL和处理请求方法之间的对应关系

//可以作用在方法上也可以作用在类上
@Target({ElementType.METHOD, ElementType.TYPE})  
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";

    
    @AliasFor("path") //别名
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    //决定请求方式 POST GET等
    //配置方法:method={RequestMethod.GET}
    RequestMethod[] method() default {};

    //标识要传递的参数
    //配置方法:params = {"username=abc"}    然后在href后面拼接 ?username=abc
    String[] params() default {};

    //规定在发送请求时必须包含的请求头
    //配置方法 headers = {"Accept"}
    String[] headers() default {};

    String[] consumes() default {};

    String[] produces() default {};
}

第三章 请求参数的绑定

说明:比如请求后的参数是username=haha&password=123

在对应的方法上声明参数:sayHello(String username,String password){} MVC就会把请求中的参数绑定到方法参数上

示例

<body>

    <%--请求参数绑定--%>
    <a href="param/testParam?username=haha">请求参数绑定</a>
</body>
/**
 * 请求参数绑定
 */
@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/testParam")
    public String testParam(String username){
        System.out.println("执行了");
        System.out.println("用户名"+username);
        return "success";
    }
}

3.1 要传的参数过多,用javabean封装起来

public class Account implements Serializable {
    private String username;
    private String password;
    private Double money;
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="text" name="password"/><br/>
    金额:<input type="text" name="money"/><br/>
    <input type="submit" value="提交"/><br/>
</form>

3.1.1 引用类型的封装

 //引用类型也可以传递和封装
    User user;
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="text" name="password"/><br/>
    金额:<input type="text" name="money"/><br/>
    用户姓名:<input type="text" name="user.uname"/><br/>
    用户年龄:<input type="text" name="user.age"/><br/>
    <input type="submit" value="提交"/><br/>
</form>

3.1.2 集合类的封装

private List<User> list;
private Map<String,User> map;
<form action="param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br/>
        密码:<input type="text" name="password"/><br/>
        金额:<input type="text" name="money"/><br/>
        用户姓名:<input type="text" name="list[0].uname"/><br/>
        用户年龄:<input type="text" name="list[0].age"/><br/>
        用户姓名:<input type="text" name="map['one'].uname"/><br/>   one表示key
        用户年龄:<input type="text" name="map['one'].age"/><br/>
        <input type="submit" value="提交"/><br/>
    </form>

运行结果:

Account{username='哈哈', password='123', money=500.0, list=[User{uname='张三', age=22}], map={one=User{uname='李四', age=2}}}

3.2 配置过滤器,解决中文乱码问题(web.xml)

<!--配置解决中文乱码的过滤器-->
    <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>

3.3 自定义类型转换器

页面提交的数据数据类型都是字符串类型,框架内部自动进行数据类型的转换

但是有可能因为页面提交的数据格式不对而无法转换(比如日期格式…/…/…可以 …-…-…不可以)。这时候就要自定义类型转换器。

步骤一 :定义类

public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        //判断
        if(s==null){
            throw new RuntimeException("请传入数据");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return df.parse(s);
        } catch (ParseException e) {
            throw new RuntimeException("转换错误");
        }

    }
}

步骤二: springmvc.xml中配置自定义转换器

 <!--开启SpringMVC注解支持  默认会让各种适配器、处理器、组件生效-->
    <mvc:annotation-driven conversion-service="conversionService"/>
    <!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.stay.controller.utils.StringToDateConverter"/>
            </set>
        </property>
    </bean>

记得在annotion-driven中也要配置,才会让自定义的转换器生效

<%--测试自定义类型转换器--%>
    <form action="param/saveUser" method="post">
        用户姓名:<input type="text" name="uname"/><br/>
        用户年龄:<input type="text" name="age"/><br/>
        生日:<input type="text" name="date"/><br/>
        <input type="submit" value="提交"/><br/>
    </form>

3.4 获得Servlet原生API

//直接传参就OK
@RequestMapping("/testServlet")
    public String testervlet(HttpServletRequest request, HttpServletResponse response){
        System.out.println(request);
        HttpSession session = request.getSession();
        System.out.println(session);

        ServletContext sc = session.getServletContext();
        System.out.println(sc);
        return "success";
    }

第四章 常用注解

4.1 @RequestParams

把请求中的参数赋给指定的形参

  public String testRequestParam(@RequestParam(name="name") String username){
        System.out.println("执行结果"+username);
        return "success";
    }
4.2 @RequestBody

获取请求体的内容,直接使用会得到key=value&key=value…结构的数据 不适用于get请求(因为它没有请求体)

 @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body){
        System.out.println("执行结果 "+body);
        return "success";
    }
执行结果:执行结果 username=haha&age=25
4.3 @PathVariable

绑定url中的占位符 /delete/{id}

在这里插入图片描述

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

访问请求:

<a href="anno/testPathVariable/10">PathVariable</a><br/>
4.4 @RequestHeader

获取指定的请求头

@RequestMapping("/testRequestHeader")
    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
可见获取到了请求头中Accept的值
4.5 @CookieValue

把指定cookie名称的值传入方法形参

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

执行结果 CD70C32FAE21BAEDA0359E245A88DE80
 (成功拿到sessionid)
4.6 @ModelAttribute

加上此注解的方法优先于用户所执行的方法执行

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

    @ModelAttribute
    public void before(){
        System.out.println("before方法执行了");
    }
}

before方法执行了
testModelAtttibute执行
before方法执行了
执行结果 FD3E1DCDAB836F261F7B820F6913B26E

应用场景:在属性没有完善的情况下,从数据库中查找出完整的数据

//与showUser2搭配才需要参数里那个配置
    @RequestMapping("/testModelAtttibute")
    public String testModelAtttibute(@ModelAttribute("abc") User user){
        System.out.println("testModelAtttibute执行");
        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;
    }*/

    @ModelAttribute
    public void showUser2(String uname, Map<String,User> map){
        System.out.println("showUser2执行了");
        User user = new User();
        user.setUname(uname);
        user.setAge(20);
        user.setDate(new Date());
        map.put("abc",user);

    }

在表单中只输入uname和age  提交后先执行了showUser(),将Date也填充进去了
4.7 @SessionAttributes

多次执行控制器方法间的参数共享

以往要将参数传递到request里,都要在方法的参数里写上HttpServletRequest request,这样做耦合性太高,有一个Model类,以键值对的方式接受参数,底层会把参数传递到request对象中

@RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model){
        System.out.println("testSessionAttributes执行");
        model.addAttribute("msg","小明");
        return "success";
    }

//现在查看request对象的话,就有msg=小明 这对参数

放到request对象后,现在就可以利用注解再把它放到session中

注意注解要写在类上

@Controller
@RequestMapping("/anno")
@SessionAttributes(value = {"msg"})//相当于把request里的对象传递到session中
public class AnnoController {
<a href="anno/testSessionAttributes">SessionAttributes</a><br/>

现在已经将msg=小明放入了session中,来取出它

 @RequestMapping("/getSessionAttributes")
    public String getSessionAttributes(ModelMap modelMap){//注意这里不能用Model了,要用它的实现类

        String msg=(String)modelMap.get ("msg");
        System.out.println(msg);
        return "success";
    }
<a href="anno/getSessionAttributes">getSessionAttributes</a><br/>
//发一个新的请求,这个请求对应上面那个类,调动上面那个类取出session

现在来删除session

@RequestMapping("/deleteSessionAttributes")
    public String deleteSessionAttributes(SessionStatus status){
        status.setComplete();//表示删除session
        return "success";
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据您提供的引用内容,FileNotFoundException: D:\BaiduNetdiskDownload\js\springmvc\out\artifacts\springmvc_war_exploded\ed\.jpg (系统找不到指定的路径。)是指程序无法找到指定路径下的文件。解决这个问题的方法是根据报错信息,在相应的目录下创建文件。比如,在D:\BaiduNetdiskDownload\js\springmvc\out\artifacts\springmvc_war_exploded\目录下,您需要创建一个ed.jpg文件。这样,程序就可以正确找到文件了。 另外,根据引用中的信息,如果您遇到类似于"class path resource找不到资源文件"的问题,可以参考上述的解决方法进行处理。注意要根据具体报错信息中的路径进行文件创建。这样能够有效解决文件路径找不到的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SpringMVC 文件上传出现异常 (系统找不到指定的路径。)](https://blog.csdn.net/qq_45738810/article/details/107776790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [解决异常FileNotFoundException:class path resource找不到资源文件的问题](https://download.csdn.net/download/weixin_38708461/12753385)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值