Spring-mvc
jar: spring-4大核心包,
测试包-2两大包,
spring-webmvc-x.x.x.RELEASE.jar -- SpringMVC核心包
spring-web-x.x.x.RELEASE.jar -- Spring对Web项目项目的支持
核心配置文件
spring-mvc.xml(可以自定义名字,一般使用默认提供的)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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.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:component-scan base-package="cn.itsource" />
<!--开启注解-->
<mvc:annotation-driven/>
<!--静态资源访问权限-->
<mvc:default-servlet-handler />
<!--视图解析-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
在tomcat容器中配置
<servlet>
<!--配置spring-mvc核心访问类-->
<servlet-name>dispater</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!--关联mvc配置文件-->
<init-param>
<!--spring固定了 contextConfigLocation 取名-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--tomcat预加载 -->
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispater</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
需要一个核心对象进行过滤org.springframework.web.servlet.DispatcherServlet配置在servlet容器中.
过滤使用 / 和/* 或者*.这样表示是在项目访问路径下访问都是经过他.如果以/名字.格式书写,它是寻找以这个结尾的地址进行访问.
使用 *.格式, 拦截以这个结尾的请求, 使用/名字,只拦截这个名字,使用/名字 / *拦截名字和其子 目录 .
这时候需要在spring-mvc配置中添加默认访问静态资源权限. <mvc:default-servlet-handler />
使用 / 的添加了资源访问权限,可以访问静态资源,如果使用 /* 就不能访问
视图解析
在spring-mvc.xml中配置bean对象.InternalResourceViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
注解使用
需要在spring-mvc.xml中配置扫描包: <context:component-scan base-package=“cn.itsource”/>
@Autowired(@Resource) 自动依赖 自动创建对象
交给spring 管理的类 @Controller (控制层注解) @service(业务层注解) @repository(持久层注解) @Component(通用注解) 功能都是一样的.
@RequestParam(“xxx”) 在传参列表中使用:解决传参变量名与前台不一致的情况(xxx写入前台的名字)
@PathVariable(“xx”) 在传参列表中使用:接收url后的参数
@ResponseBody 跳过视图解析器 可以用于返回json数据
Controller层的类3中实现
1.实现controller类
public class ControllerTest implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView();
}
}
2.实现HttpRequestHandler类(跟servlet 类似)
3.注解
@Controller
public class XxxController{
@RequestMapping("/xxx") //配置访问路径
public void method(){
returnnew ModelAndView();
}
}
接收form表单参数
1.通过servlet-api.jar包中的HttpServletRequest对象中的getParameter方法获取参数.直接在controller注解类中的方法传参列表中加入此参数.
@RequestMapping("/form")
public void form(HttpServletRequest ht){
String parameter = ht.getParameter("name");
}
2.直接在方法传参列表中加入前端接收参数的名字,要考虑接收参数的类型.
@RequestMapping("/form")
public void form(String name , String pwd){}
3.直接在方法传参列表中加入一个对象,对象中的属性名和接收参数的名字一一对应.
@RequestMapping("/form3")
public void form(User user){}
传递给前端参数
1.通过servlet-api.jar包中的HttpServletRequest对象中的setAttribute方法传递参数.
@RequestMapping("/form")
public void form(HttpServletRequest ht){
ht.setAttribute("数据名称", "传值");
}
2.通过传参列表添加Model model形参传入一个封装好的对象,可以进行传参.
@RequestMapping("/form")
public void form(Model model){
model.addAttribute("数据名称", "传值");
}
3.通过返回值改为ModelAndView,在其中new ModelAndView()类
@RequestMapping("/form")
public ModelAndView form(){
ModelAndView mv = new ModelAndView();
mv.addObject("数据名称", "传值");
return mv;
}
跳转
1.如果没使用ModelAndView返回值,就把返回值改为String,返回地址
@RequestMapping("/form")
public String form(Model model){
return "项目地址";
}
2.使用了ModelAndView
@RequestMapping("/form")
public ModelAndView form(){
ModelAndView mv = new ModelAndView();
mv.setViewName("项目地址");
return mv;
}
以上如果有视图解析器,就会被拼接.
跳过视图解析器
1.forward 转发
@RequestMapping("/form")
public String form(Model model){
return "forward:项目地址";
}
2.redirect 重定向
@RequestMapping("/form")
public String form(Model model){
return "redirect:项目地址";
}
过滤器(编码问题)
在web.xml配置.使用的是org.springframework.web.filter.CharacterEncodingFilter类
<filter>
<filter-name>filter</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>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JSON使用
使用的jar包:
jackson-databind-2.5.0.jar
jackson-core-2.5.0.jar
jackson-annotations-2.5.0.jar
springMVC返回json数据
在controller类的方法上使用@ResponseBody注解, 可以返回值为String,list,map,数组等,传入前端为json格式数据
对json数据中的日期格式处理
传入前端,需要在返回值对象所对应的类中的日期getter方法上加上 @JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”,timezone=“GMT+8”)
前端传入后端,需要得到传入的数据对应的类中的日期setter方法上加上 @DateTimeFormat(pattern=“yyyy-MM-dd HH:mm:ss”)
解决JSON在IE浏览器出现下载文件框的问题.(乱码问题)
在sping-mvc.xml配置
<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>
Spring中的文件上传和下载
文件上传:
1.首先,在jsp请求网页表单上添加enctype属性属性值为 multipart/form-data . 必须为post请求
2.导入jar包
com.springsource.org.apache.commons.fileupload-1.2.0.jar
com.springsource.org.apache.commons.io-1.4.0.jar
3.必须配置视图解析器MultipartResolver
在spring-mvc.xml中配置:
<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>
4.在java中实现上传功能
@RequestMapping("/fileload")
@ResponseBody
public String upLoad(String name,MultipartFile filename,HttpServletRequest req){
//①在传参列表中写入MultipartFile对象,判断是否上传和获取输入流
if(!filename.isEmpty()){
try {
InputStream in = filename.getInputStream();
//②解决上传覆盖问题
String uid=System.currentTimeMillis()+filename.getOriginalFilename();
//③获取文件在项目相对地址,解决路径问题
File file=new File(req.getServletContext().getRealPath("项目下可以写入访问的uri如:/xxx"),uid);
//④创建输出流并输出
FileOutputStream out = new FileOutputStream(file);
IOUtils.copy(in, out);//第三方工具输出,jar在之前2个jar之中
//⑤关流
out.close();
in.close();
} catch (Exception e) {}
}
return "跳转路径";
}
文件下载:
1.java中实现下载功能(解决中文乱码问题) 配置和上传一致
@RequestMapping("/down")
@ResponseBody
public String down(HttpServletResponse resp,HttpServletRequest req,String filename){
try {
//得到文件路径输入流
InputStream in = new FileInputStream(new File(req.getServletContext().getRealPath("/")+filename));
//解决ie等浏览器中文编码问题
if(req.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT")!=-1){
filename = URLEncoder.encode(filename, "utf-8");
}else if(req.getHeader("User-Agent").toUpperCase().indexOf("EDGE")!=-1){
filename = URLEncoder.encode(filename, "utf-8");//电脑自带edge【edʒ】浏览器
}else{
filename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");//其他浏览器
}//设置相应头 弹出下载文件框
resp.setHeader("Content-Disposition", "attachment; filename=" + filename);
//输出流传递
OutputStream out = resp.getOutputStream();
IOUtils.copy(in, out);
//关闭流
out.close();in.close();
} catch (Exception e) {}
return "sss";
}
SpringMVC拦截器
1.需要在spring-mvc.xml中配置
<!-- 配置拦截器组 -->
<mvc:interceptors>
<!-- 拦截器 -->
<mvc:interceptor>
<!-- 要拦截的配置,该配置必须写在不拦截的上面,/*拦截一级请求,/**拦截多级请求 -->
<mvc:mapping path="/**" />
<!-- 设置不拦截的配置 -->
<mvc:exclude-mapping path="/url路径"/>
<!-- 配置拦截器 -->
<bean class="自己拦截器的全限定名" />
</mvc:interceptor>
</mvc:interceptors>
2.自己创建类实现HandlerInterceptor接口.
重写preHandle方法(在业务访问之前调用,为true时,通过),afterCompletion方法(一次请求执行一次),postHandle方法(调用一次controller就执行一次).
SpringMVC执行流程
1 客户端将请求统一提交到DispatcherServlet(Spring核心控制类);
2 DispatcherServlet会将请求交给HandlerMapping进行请求映射,匹配该请求的Handler(对应的url路径请求);
3 DispatcherServlet再请求HandlerAdapter调用相应的Handler处理请求(对应的controller类中调用),并向前端控制器返回一个ModelAndView对象(最后都会被封装成ModelAndView对象返回给DispatcherServlet);
4 DispatcherServlet将ModelAndView对象交给ViewResoler视图解析器处理,返回指定的视图View(比如访问地址拼接);
5 DispatcherServlet 对 View 进行渲染(即将模型数据填充至视图中)(解析jsp数据填充网页);
6 DispatcherServlet 将页面响应给用户;