SpringMvc
第一次写博客,感觉写的不是很不好,如果当中有啥bug,欢迎大家讨论
1. mvc框架做那些事情
a,将一个url映射到一个java类,或者java的方法
b.封装用户提交的数据
c.处理请求,调用相关的业务处理——封装相应的数据
d.将响应的数据进行渲染,返回给jsp,html,freemarker等
2,springmvc是一个轻量级的基于请求响应的mvc框架
3,特点:
简单,易学,开发效率高(可以使用注解开发)
但是性能低(创建一套完整的mvc框架),
天生和spring无缝集成(使用spring aop,ioc)
使用约定由于配置
支持Result风格
异常处理
数据验证,类型转换,拦截器等
使用的人多,公司多
4:结构图
简单案列及其常见配置
1 配置:首先导入相关的jar包
2 配置web.xml文件
<!-- 配置springmvc文件 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- 此配置为将springmvc的配置文件纺织在src地下,文件名字为:springmvc.xml --> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 配置springmvc容器随tomcat一起启动 --> <load-on-startup>1</load-on-startup> </servlet> <!-- 如果请求我*.do则执行继续执行 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> |
3 配置springmvc文件(此文件为web.xml<param-value>的classpath所指定的文件)
<?xml version="1.0" encoding="UTF-8"?> <!-- 配置的头文件 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 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">
<!-- 配置handerAdapter 适配器 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<!-- 配置视图渲染器 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <!-- 将视图名渲染后视图的前缀 --> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 渲染后视图的后缀 --> <property name="suffix" value=".jsp"/> <!-- 例:视图名为:hello 渲染后:/WEB-INF/jsp/hello.jsp 该页面--> </bean>
<!-- 最常用的就是通过注解开发,简单高效,最为常用,可以配置多个包,用来进行扫描 --> <!-- spring容器扫描指定包下的所有类,如果类上有注解 那么根据注解产生相应bean对象已经映射信息 --> <context:component-scan base-package="com.springmvc"/> <mvc:annotation-driven /> </beans> |
4 Controler代码:
将数据封装显示到表示层页面一般有两种,ModelAndView,ModelMap
相同点:都可以讲数据解析到jsp页面
不同点:ModelAndView可以指定跳转视图但是ModelMap不能
ModelAndView需要视图解析器
ModelMap不需要
@Controller publicclass SpringMvc {
//通过视图解析器将数据解析到jsp页面 @RequestMapping("/hello") public ModelAndView hello(HttpServletRequest req,HttpServletResponse resp){ ModelAndView mv = new ModelAndView(); System.out.println("你好世界"); //相当于req.setAttribute("hello", "你好spingmvc,最流行的框架之一"); mv.addObject("hello", "你好spingmvc,最流行的框架之一"); //视图名 mv.setViewName("hello"); //相当于:web-inf/jsp/hello.jsp returnmv; } //不需要视图解析器,也可以需要,通过ModelMap来实现ModelMap需要作为处理方法的参数 @RequestMapping("ModelMap") public String ac(String name,ModelMap model){ model.addAttribute("name", name); System.out.println(name); return"hello.jsp"; 不需要视图解析器的配置,但是配置了,起作用 } |
5 转发与重定向
//无视图解析器 转发实现1 public String hello(){ return"index.jsp"; } //无视图解析器 转发实现2 public String hello2(){ return"forward:index.jsp"; } //重定向 public String hello03(){ return"redirect:index.jsp"; }
//通过springmvc来实现转发和重定向 有视图解析器 //转发 public String hello04(){ return"hello"; //转发利用视图解析器直接补充前后缀 } //重定向 public String hello05(){ return"redirect:index.jsp"; //注意重定向是不需要视图解析器的 } |
提交表单数据,controler获取
/* * 获取单个数据时候,直接定义一个相同类型的变量,并且变量名相同, * (也可以变量名字不相同,springmvc提供了这种机制,但是自己不要和自己过不去,没任何意义) * 然后将数据写到方法的参数里面,注意不需要提供参数名的get,set方法,即可获取 * 如若传递过来的是多个数据,那就可以创建一个对象,然后将多个数据变为对象的属性,并且提供get set方法, * (对象一定得提供get,set方法) * 注意:在struts2当中,表单元素为对象的属性时,name属性必须为对象.属性 * 而在springmvc当中,name值直接为属性名字,不需要.啥的 * */ @RequestMapping("/aaa") public String AAA(User user){ //User为一个对象 System.out.println(user); return"redirect:aaa.jsp"; } |
package com.springmvc;
publicclass User {
private String name; privateintage; private String address; public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } publicint getAge() { returnage; } publicvoid setAge(intage) { this.age = age; } public String getAddress() { returnaddress; } publicvoid setAddress(String address) { this.address = address; } @Override public String toString() { return"User [name=" + name + ", age=" + age + ", address=" + address + "]"; }
}
|
文件的上传
1、 导入相关的jar包
2. 配置相关的文件,在web.xml指定的springmvc.xml文件中进行相应的配置
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置编码格式 --> <property name="defaultEncoding" value="utf-8"></property> <!-- 设置文件大小 --> <property name="maxUploadSize" value="10485760000"></property> <!-- 设置缓冲区大小 --> <property name="maxInMemorySize" value="40960"></property> </bean> |
Controler代码
//文件的上传 @RequestMapping("/upload") public String upload(@RequestParam("file")CommonsMultipartFile file,HttpServletRequest req){ //获取文件名 //file.getOriginalFilename(); //获取文件上传的路径 System.out.println("开始上传文件"); String path = req. //获取文件的输入流 String filename=file.getOriginalFilename(); InputStream is = null; OutputStream ous = null; longa = System.currentTimeMillis(); try { is = file.getInputStream(); ous = new FileOutputStream(new File(path,filename)); intlen = 0; byte[] b = newbyte[400]; while((len=is.read(b))!=-1){ ous.write(b,0,len); System.out.println(b); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { ous.close(); is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } longb = System.currentTimeMillis(); System.out.println("文件上传完毕,用时"+(b-a)); return"aaa"; } |
文件的批量上传
//文件的批量上传 @RequestMapping("/bupload") public String upload1(@RequestParam("file")CommonsMultipartFile file[],HttpServletRequest req){ //获取文件名 //file.getOriginalFilename(); //获取文件上传的路径 for(inti=0;i<file.length;i++){ System.out.println("开始上传文件"); String path = req. //获取文件的输入流 String filename=file[i].getOriginalFilename(); InputStream is = null; OutputStream ous = null; longa = System.currentTimeMillis(); try { is = file[i].getInputStream(); ous = new FileOutputStream(new File(path,filename)); intlen = 0; byte[] b = newbyte[400]; while((len=is.read(b))!=-1){ ous.write(b,0,len); System.out.println(b); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { ous.close(); is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } longb = System.currentTimeMillis(); System.out.println("文件上传完毕,用时"+(b-a)); } return"aaa"; } |
文件的指定路径
Jsp页面
<form action="bupload.do" enctype="multipart/form-data" method="post"> 文件1:<input type="file" name="file"/><br/> 文件2:<input type="file" name="file"/><br/> <input type="submit" value="上传"/><br/> </form> </body> |
Sprringmvc中处理json
1.使用HttpServletResponse来处理,一般不需要视图解析器
@RequestMapping("/ajax") publicvoid ajax(String name,HttpServletResponse resp) throws IOException{ if("siggy".equals(name)){ resp.getWriter().print("true"); }else{ resp.getWriter().print("false"); }
} |
采用jquey框架
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script> <script type="text/javascript"> $(function () { $("#textname").blur(function () { $.post("ajax.do",{'name':$("#textname").val()},function(data){
alert(data); });
}); }) |
2,springmvc处理json数据
a,导入相关jar包
b,配置json转换器
<!-- 用于将对象转换为 JSON --> <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="stringConverter" /> <ref bean="jsonConverter" /> </list> </property> </bean> |
c.controler代码
@RequestMapping("/json") @ResponseBody public List<User> user(){ List<User> list = new ArrayList<User>(); list.add(new User(1,"张三","男")); list.add(new User(2,"李四","女")); list.add(new User(3,"王五","男")); returnlist; } |
$(function () { $("#textname").click(function () { $.post("json.do",function(data){ var html=""; for(var i=0;i<data.length;i++){ html+="<tr><td>"+data[i].id+"</td><td>"+data[i].name+"</td><td>"+data[i].sex+"</td></tr>"; } $("#container").html(html); });
}); })
<input type="button" id="textname" value="获取数据"/> <table width="80%" align="center"> <tr> <td>编号</td> <td>姓名</td> <td>性别</td>
</tr> <tbody id="container"> |
拦截器
1 不需要jar包
2 头文件的配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 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 |
<mvc:interceptors> <!-- 在 mvc:interceptors中可以配置多个拦截器 多个拦截器按顺序一一执行 --> <mvc:interceptor> <!-- 指明哪些请求需要被拦截 /login.do 表示login.do需要被拦截 /user/add.do 表示/user/add.do请求要被拦截 /* 表示项目路径下的所有请求被拦截 可以拦截: /login.do /add.do /user.do /sys.do等 /**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截 可以拦截: /login.do /add.do /user.do /sys.do /user/add.do --> <mvc:mapping path="/**"/> <!-- 指定拦截器的位置 --> <bean class="com.springmvc.SpringMvc"></bean> </mvc:interceptor> |
3 拦截代码 实现一个接口
package com.springmvc; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class SpringMvc implements HandlerInterceptor{
//请求处理的方法之前进行执行 //如果返回为true,那么执行下一个拦截器,如果返回false那么不执行下一个拦截器 @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("-----------处理之前---------------"); return true; }
//请求方法处理之后执行 @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("----------------处理之后----------------"); }
//在DispatcherServlet处理后执行 清理工作 @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub
} } |
登录拦截案列
1 配置以及拦截的对象
<mvc:interceptor> <!-- 指明哪些请求需要被拦截 /login.do 表示login.do需要被拦截 /user/add.do 表示/user/add.do请求要被拦截 /* 表示项目路径下的所有请求被拦截 可以拦截: /login.do /add.do /user.do /sys.do等 /**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截 可以拦截: /login.do /add.do /user.do /sys.do /user/add.do --> <!-- 拦截所有 --> <mvc:mapping path="/**"/> <!-- 指定拦截器的位置 --> <bean class="com.springmvc.LoginIntereceptor"> <!-- 类似于struts2注入参数 --> <property name="allowedPass"> <list> <!-- 允许通过的url --> <value>login.do</value> </list> </property> </bean> </mvc:interceptor> |
2 登录验证
@RequestMapping("/login") public String login(User user,HttpSession session){ System.out.println(user); if("username".equals(user.getName())&&"123".equals(user.getPassword())){ session.setAttribute("user", user); return"redirect:/success.jsp"; } //密码错误,重定向到login.jsp return"redirect:/login.jsp"; } @RequestMapping("/aaa") public String login01(User user,HttpSession session){
//密码错误,重定向到login.jsp return"redirect:/aaa.jsp"; } |
3 拦截器代码
//哪些url不被拦截 private List<String> allowedPass; publicboolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { System.out.println("进入拦截器"); //先判断session中是否有 Object user = request.getSession().getAttribute("user"); if(user!=null){ returntrue; } String url = request.getRequestURI().toString(); System.out.println(url); //获取拦截器当中注入的每个参数值,然后进行判断,如果某个符合,直接返回true,进行下一步 for(String temp:allowedPass){ System.out.println(temp); if(url.endsWith(temp)){ returntrue; } }
returnfalse; }
@Override publicvoid afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub
}
@Override publicvoid postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub
} publicvoid setAllowedPass(List<String> allowedPass) { this.allowedPass = allowedPass; } |