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>
因为也是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"; } } }
这里我们需要开启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"; } }
这样的跳转方式为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); } }
直接通过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