spring-mvc (一)

Spring MVC是一个用于构建Web应用程序的全面框架,它将模型、视图和控制器分离,提高了程序的可维护性。本文详细介绍了Spring MVC的使用步骤,包括添加依赖、配置web.xml、创建控制器、处理视图、接收请求参数、使用模型数据、处理JSON响应以及解决常见错误。通过这些步骤,你可以更好地理解和应用Spring MVC。

spring-mvc

model 模型 - 数据和操作数据的逻辑(狭义的就是数据)   包括了实体类和业务类(例如 User,UserService)
view 视图 - 数据展现, 包括(jsp, jstl, el)
controller 控制器 把模型和视图关联在一起, 包括servlet

作用 : 让程序的各个部分分工清晰,各司其职。让程序的可维护性提高。

使用步骤 :

1. pom.xml文件中添加spring-webmvc等依赖

        <!--决定了是maven的web项目--> 
        <packaging>war</packaging>        

       <!-- spring 对mvc的支持 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.17.RELEASE</version>
        </dependency>

        <!-- 添加servlet相关依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope> <!-- tomcat已经提供了该jar包,此jar包只工作在编译环境 -->
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.2.1</version>
            <scope>provided</scope> <!-- tomcat已经提供了该jar包,此jar包只工作在编译环境 -->
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- 文件上传(可选) -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>


        <!-- 加入json转换的jar包 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.1</version>
        </dependency>

 

 

2. 在spring-mvc.xml中添加mvc的xml命名空间

 

3. 手动补充一个src/main/webapp目录
  
 src/main/webapp/WEB-INF/web.xml
   在配置tomcat时选择 项目名:war exploded

   web-xml :

<!-- 职责: 
   1.作为统一入口
   2.创建spring容器
   3.在tomcat启动时,就把spring容器创建好
-->
<servlet>
	<servlet-name>springmvc</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<!-- 指明了spring配置文件的位置 -->
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring-mvc.xml</param-value>
	</init-param>
	<!-- 在tomcat启动时,就创建这个servlet,并初始化该servlet -->
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>springmvc</servlet-name>
	<url-pattern>/</url-pattern> 
	<!-- 给 DispatcherServlet 指定路径 
	假设浏览器  /hello  没有,会找 / 这个路径
			   /s1     没有,会找 / 这个路径
			   
			 只要没有其他servlet能够精确匹配这个请求路径,这个请求都会被 / 的这个servlet来处理
	-->
</servlet-mapping>

 <!-- spring 提供的字符编码过滤器 -->
    <filter>
        <filter-name>encoding</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>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

 

4.  控制器

@Controller
public class 控制器类{
	
	@RequestMapping("/请求路径")
	public String 控制器方法(){
		
	}
}

// 控制器类要交给spring容器管理

<bean id="helloController" class="com.westos.controller.HelloController"/>

并spring-mvc中加入:`<mvc:annotation-driven/>` 来启用mvc的相关功能

 

 

5. 处理视图

控制器方法返回值为视图名,加上前缀后缀便构成视图路径

<mvc:view-resolvers>
	<mvc:jsp prefix="/" suffix=".jsp"/>
</mvc:view-resolvers>

控制器根据路径用请求转发跳转

请求被处理的流程 :

           1) 请求从浏览器发送到tomcat, 地址为:http://localhost:8080/hello
           2) tomcat先将该路径与servlet进行匹配,结果没有精确的地址与之匹配,就找到了 / 这个地址
              /  地址对应的是DispatcherServlet,由它来处理请求
           3) DispatcherServlet 再到spring容器中找控制器类
               把每个控制器中带有@RequestMapping的方法路径与请求路径进行匹配,
           4) 匹配到了就执行该方法, 如果匹配不到报404错误
           5) 根据方法的返回结果找到jsp视图
           6) 由jsp视图生成html代码作为响应返回给浏览器

 

 

6. 接收请求参数

     1) 把方法参数和请求参数直接对应
     2) 写一个实体类型,把实体的属性与请求参数对应
     3) 路径参数(把参数值不是写在?之后,而是包含在路径当中)
        /deleteUser?id=1   传统写法
        /deleteUser/1      路径参数 要删除1号用户
        /deleteUser/2     要删除2号用户
      
       路径参数可以通过@PathVariable 与方法参数一一对应
        @RequestMapping("/deleteUser/{x}")
         public String 控制器方法(@PathVarible("x") int id) {}

   

 

7. 使用模型数据
Model 接口, 代表了模型数据, 它也是加在控制器方法之上 可以直接使用它的实现类ModelMap或Map
public String 控制器方法(请求参数, Model model) {}
向模型添加数据: model.addAttribute("变量名", 值);
model中的数据在转发之前,都会被存入request作用域

springmvc中常见错误

    400 错误 :

                     1) 发生在请求参数赋值给方法参数时,发生了类型转换问题
                         例如:字符串转整数错误,可以用Integer包装类
                                    字符串转日期 对于日期需要加 @DateTimeFormat(pattern="日期格式")

                      2) 中文乱码 : 可以配置spring提供的字符编码过滤器

静态资源的404错误:

     静态资源是指 图片、css、html、js
          原因是DispatcherServlet的路径是/ 跟tomcat中处理图片的Servlet路径冲突了
          所以所有图片的请求被DispatcherServlet所处理,把图片的路径当做了控制器路径
     解决办法:    
          在spring配置文件中加入:`<mvc:default-servlet-handler/>`

<filter>
	<filter-name>encoding</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>encoding</filter-name>
	<url-pattern>/ *</url-pattern>
</filter-mapping>

 

8. json格式的响应

json: javascript object notation (javascript对象标记)

响应格式 : 文本格式,类似于javascript的对象写法

{
    "username":"张三",
    "age":18
}

步骤 :

       1) pom文件中加入相应的依赖:

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.9.1</version>
</dependency>  

       

       2) 控制器方法上添加 @ResponseBody注解, 可以把方法的返回值(可以是集合,数组,实体类)转换为json字符

             java中 map以及实体类 会被转换为json中的对象 {属性名:属性值}
             java中 list或数组  会被转换为json中的数组  [元素1, 元素2, ...]

json常见注解 : 

           1) @JsonFormat 可以对日期类型进行格式化
               @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 注意加8小时才是北京时间
           2) @JsonIgnore 可以在转换时忽略加了@JsonIgnore的属性
           3) @JsonProperty("新的属性名") 可以在转换时改变属性的名字

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值