springmvc

SpringMVC

1. 是一种代替servelt的一种框架所以需要导入相应的jar

1spring-webmvc-4.1.2.RELEASE.jar

spring-web-4.1.2.RELEASE.jar

2核心控制器driver

 

所以需要配置web.xml把以前的servelt换位该类

<?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_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>2019_09_04_springmvc</display-name>
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!-- 找到文件中的配置文件,和src下面的xml名称 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 通配符处理 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
</web-app>
View Code

因为也是spring框架所以也要准备映射路径,在applicationContext.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置最简单的beans -->
<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 -->

    <!-- <bean name="/hello" class="cn.jiedada.controller.HelloController"></bean> -->
    
    <!-- 扫描@controller -->
    <context:component-scan base-package="cn.jiedada"></context:component-scan>
    <!-- 调用@requestMapping() -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 放行静态资源 -->
    <mvc:default-servlet-handler/>
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property><!-- 加入前缀 -->
        <property name="suffix" value=".jsp"></property><!-- 加入后缀 -->
    </bean>
    <!-- 配置上传下载文件 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="1048576"></property>
    </bean>
</beans> 

这里我就把今天所以的映射写出来了,但是他默认的映射路径为

/WEB-INF/springmvc-servlet.xml文件

所以我们需要配置我们的映射路劲

在web.xml配置

<init-param>
   <!-- 找到文件中的配置文件,和src下面的xml名称 -->
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:applicationContext.xml</param-value>自己需要的配置文件
  </init-param>

写mvc的三种方式

1.实现Controller接口

2实现h't't'prequestHander接口

3.注解@controller

package cn.jiedada.controller;

import javax.servlet.http.HttpServletRequest;

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

import cn.jiedada.domain.User;

//开启注解
@Controller
//一级匹配
@RequestMapping("/login")
public class Controllet {
    //二级匹配
    @RequestMapping("/form2")
    public void f1(String name,String pwd){
        System.out.println(name+"--"+pwd);
    }
    @RequestMapping("/form3")
    public void f2(User user){
        System.out.println(user.getName()+"--"+user.getPwd());
    }
    @RequestMapping("/form5")
    public String f2(String name,String pwd,HttpServletRequest req,Model model){
        if(name.equals("tom")&&pwd.equals("123456")){
            model.addAttribute("name", name);
            return "jsp/success";
        }else{
            model.addAttribute("error5", "账号或者密码错误");
            model.addAttribute("name5", name);
            return "jsp/model2";
        }
    }
    
}
View Code

这里我们需要开启applicationContex.xml中的注解

<!-- 扫描@controller -->
 <context:component-scan base-package="cn.jiedada"></context:component-scan>
 <!-- 调用@requestMapping() -->
 <mvc:annotation-driven></mvc:annotation-driven>

需要开启注解扫描(找到什么类中的包及子包看有没有打上注解)

因为springmvc不能访问静态资源(不能更改的资源如:HTML,图片等)所以我们也需要开启注解访问静态资源

<!-- 放行静态资源 -->
 <mvc:default-servlet-handler/>

因为也存在编码问题,所以springmvc给我们配置了编码

<!-- 配置utf-8 -->
 <filter>
  <filter-name>characterEncoding</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>characterEncoding</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

为过滤器

向页面传值

我们可以配置一个视图解析器(把我们返回的字符串前面加上什么,后面加上什么,然后去找相应的页面,如果有,则返回页面,没有返回404)

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/"></property><!-- 加入前缀 -->
  <property name="suffix" value=".jsp"></property><!-- 加入后缀 -->
 </bean>

这里我们使用medol像页面传值

@RequestMapping("/form5")
    public String f2(String name,String pwd,HttpServletRequest req,Model model){
        if(name.equals("tom")&&pwd.equals("123456")){
            model.addAttribute("name", name);
            return "jsp/success";
        }else{
            model.addAttribute("error5", "账号或者密码错误");
            model.addAttribute("name5", name);
            return "jsp/model2";
        }
    }
View Code

这样的跳转方式为forward,

跳转方式,如果我们我们不需要使用视图解析器的话可以

可以通过return "forword:index.jsp"

"redirect:index.jsp"实现转发和重定向

返回json

因为前端页面使用的是json

需要使用该注解@ResponseBody//将返回的数据自动转换成json格式的数据,而且是用了@ResponseBody,不会经过视图解析器

(1) Json表示对象:{"name":"tom","age":18}

(2) Json表示一个集合:[{"name":"tom","age":18},{"name":"jack","age":30}]

所以我们需要的时返回一个json对象,这里我们

<!-- 开启spring对MVC的支持 -->
<mvc:annotation-driven>
    <!-- 避免在IE浏览器中返回JSON时出现下载文件的情况 -->
    <mvc:message-converters>
        <bean id="mappingJackson2HttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

ie中测试,会弹出下载文件的窗口,可以在spring-mvc.xml<mvc:annotation-driven>中加入以下配置解决:

做上传下载文件

我们对上传文件进行下载也需要使用包

Ø com.springsource.org.apache.commons.fileupload-1.2.0.jar

Ø com.springsource.org.apache.commons.io-1.4.0.jar

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大尺寸为1MB -->
    <property name="maxUploadSize">
        <!-- spring el写法:1MB -->
        <value>#{1024*1024}</value>
    </property>
     <!-- 效果同上 -->
<property name="maxUploadSize" value="1048576" />
</bean>

所以也需要配置映射在applicationContext.xml

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="1048576"></property>
 </bean>

这样我们可以使用其中的方法,我们直接使用IOUtil.copy()的方法就能直接下载下来了这里为自己写的一个下载工具类

package cn.jiedada.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.IOUtils;
import org.springframework.web.multipart.MultipartFile;

public class UploadUtil {
    public static String upload(HttpServletRequest req,MultipartFile photo){
        if(!photo.isEmpty()){
            //创建一个文件
            //判断是否存在,存在就不创建文件夹,不存在就创建
            String path = req.getServletContext().getRealPath("/UploadFile");
            File file = new File(path);
            if(!file.exists()){
                file.mkdir();
            }
            //获得上传文件的名字
            String orname = photo.getOriginalFilename();
            //在经行uuid加密
            String rename = UUID.randomUUID().toString().replace("-", "");
            String realname=rename+"_"+orname;
            InputStream in =null;
            FileOutputStream out=null;
            try {
                //获得输入流
                in = photo.getInputStream();
                //获得输出流
                out = new FileOutputStream(new File(file,realname));
                //文件上传
                IOUtils.copy(in, out);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                try {
                    //关闭流
                    out.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally{
                    try {
                        in.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
            }
            return realname;
        }
        return null;
    }
}
@Controller
public class UploadTest {
    @RequestMapping("/upload")
    public void upload(HttpServletRequest req,MultipartFile photo){
        String upload = UploadUtil.upload(req, photo);
        System.out.println(upload);
    }
}
View Code

直接通过requestMapping()请求获得其中的值,并且添加进去简单的长传下载就完成了

拦截器

类似于过滤器,也需要配置

<!-- 配置拦截器组 -->
<mvc:interceptors>
    <!-- 拦截器 -->
    <mvc:interceptor>
        <!-- 要拦截的配置 -->
        <mvc:mapping path="/*"  />
        <!-- 设置不拦截的配置 -->
        <mvc:exclude-mapping path="/login"/>
        <!-- 配置拦截器 -->
        <bean class="cn.itsource.springmvc._06_interceptor.MyInterceptor" />  
    </mvc:interceptor>
</mvc:interceptors>

 去实现就可以了implements HandlerInterceptor

原文地址:https://www.cnblogs.com/xiaoruirui/p/11470802.html