Springmvc与Struts2的区别
springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,
将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
springmvc拦截器在java文件里面的写法:
preHandle:在控制器方法调用前执行, 返回值为是否中断:true,表示继续执行(下一个拦截器或处理器);false则会中断后续的所有操作,所以我们需要使用response来继续响应后续请求
afterCompletion:整个请求完成,即视图渲染结束后调用,这个时候可以做些资源清理工作,或日志记录
postHandle:在控制器方法调用后,解析视图前调用,我们可以对视图和模型做进一步渲染或修改,可在modelAndView中加入数据,比如当前时间
配置拦截器,在springmvc.xml中添加配置:
<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/login"/>
<bean class="cn.interceptor.LoginIntercetor"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
文件上传:
springmvc与struts2默认使用的上传组件都是fileupload.
步骤1:添加spring依赖的jar文件fileupload组件所依赖的jar文件
步骤2:在web.xml中配置前端控制器
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.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>
步骤3:在src下新建spring的配置文件springmvc.xml
<!-- 注解扫描 -->
<context:component-scan base-package="cn"></context:component-scan>
<!-- springmvc使用<mvc:annotation-driven> -->
<!-- 自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,
可用在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 处理静态资源 -->
<mvc:default-servlet-handler/>
<!-- 上传文件的视图解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上次文件的最大大小,单位为字节 -->
<property name="maxUploadSize" value="100000000"></property>
</bean>
步骤4:编写UploadController
@Controller
public class UploadController {
@RequestMapping("/upload")
public String upload(@RequestParam("uploadFile") MultipartFile uploadFile,HttpServletRequest request){
//获取服务器端的路径
String realPath = request.getServletContext().getRealPath("/");
File uploadDir = new File(realPath,"upload");
if(!uploadDir.exists())
uploadDir.mkdirs();
//获取待上传的原始文件名称
String fileName = uploadFile.getOriginalFilename();
//FileUtils.copyFile(uploadFile, new File(uploadDir,fileName));
try {
uploadFile.transferTo(new File(uploadDir,fileName));
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
步骤5:编写上传页面upload.jsp
注意:form表单添加属性enctype="multipart/form-data"支持文件上传
<form action="upload" method="post" enctype="multipart/form-data">
文件:<input type="file" name="uploadFile"/>
<input type="submit" value="上传"/>
</form>