SpringInAction--SpringMvc高级技术(servlet、filter、multipart)
前面学了spirng的一些配置,以及web方面的知识,今天就在学习一下在spring比较常用的一些高级技术。。。
首先来介绍下什么叫servlet吧(来着维基百科)
Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
我刚开始没有接触到框架的时候,写的服务就是新建一个servlet,之后还知道了struct2 之后才知道spring框架。。
spring in action 这本书中,推崇的配置是常用java来配置文件的。但是我们好像在平时中常用的还是xml配置。。先来看一下java注解来使用servlet的方法:
public class MyServletConfig implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
Dynamic myServlet = servletContext.addServlet("myServlet", com.springmvc.servlet.TestServlet.class);
myServlet.addMapping("/servlet");
}
}
然后我们在来看看xml的配置:
<servlet>
<servlet-name>servletTest</servlet-name>
<servlet-class>com.springmvc.servlet.TestServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>servletTest</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
然后我们创建一个调用接口HttpServlet的servlet:
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter pw = resp.getWriter();
pw.write("<h1> hello servlet!</h1>");
}
}
部署到Tomcat上面输入 http://localhost:8080/servlet
运行结果为:

这样一来简单的servlet如何在springmvc中使用我们就学会了.
下面就让我们来学一下filter的用法,首先是用java配置方式
public class MyFilterConfig implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
Dynamic myFilter = servletContext.addFilter("myFilter", com.springmvc.filter.TestFilter.class);
myFilter.addMappingForUrlPatterns(null, false, "/back/*");
}
}
下面是xml注解方式:
<filter>
<filter-name>fileterTest</filter-name>
<filter-class>com.springmvc.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>fileterTest</filter-name>
<url-pattern>/back/*</url-pattern>
</filter-mapping>
然后写个TestFilter类,这个是我以前写的一个简单判断是否登录的一个filter,如果没有登录的话,就跳转到登录界面,只有登录了之后才能继续访问某个文件夹,或者说某个项目下的东西:
public class TestFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
HttpSession session = req.getSession();
//获取请求路径
String path = req.getRequestURI();
//获取session中作为判断的字段
String pwd = (String) session.getAttribute("passwd");
System.out.println(pwd);
//判断请求的 路径中是否包含了 登录页面的请求
//如果包含了,那么不过滤 继续执行操作
if (path.indexOf("/back/login.do") > -1 || path.indexOf("/back/isLogin.json") > -1) {
filterChain.doFilter(req, resp);
} else {
//如不包含,那么就要判断 session中否有标志,如果没有标志,那么不让他看,让他去登录,反之执行操作!
if (pwd == null || "".equals(pwd)) {
resp.sendRedirect("/back/login.do");
} else {
filterChain.doFilter(req, resp);
}
}
}
public void destroy() {
}
}
因为没有写 http://localhost:8080/back/login.do 的请求方法,所以是404,运行结果如下:

上面就是在springmvc中用filter
下面继续来看multipart文件上传,这个用的也蛮多的,我一般图像啊,文件啊,上传都是用这个上传的。
一般来说分为两种:
- CommonsMultipartResolver:使用Jakarta Commons FileUpload解析Multipart请求
- StandardServletMultipartResolver:依赖于Servlet 3.0对multipart请求的支持(始于Spring 3.1)。
首先我们来看看java配置:
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setDefaultEncoding("utf-8");
multipartResolver.setMaxInMemorySize(40960);
multipartResolver.setMaxUploadSize(10485760);
return multipartResolver;
}
xml的注解方式:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxInMemorySize" value="40960"/>
<property name="maxUploadSize" value="10485760"/>
</bean>
然后在页面中加上上传所需的组件:
<h1>Multipart上传测试</h1>
<form id="form" enctype="multipart/form-data" action="/upload.do" method="post">
<input id="file" name="file" type="file">
<input type="submit" value="开始上传">
</form>
这里我们要注意了 两个地方 enctype method 这两个参数 一定要有且后面的要为post要不然会报错
HTTP Status 500 - Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: The current request is not a multipart request
一开始我忘记配置 上传的配置了 报下面的错:
HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
controller的编写也很简单,如下:
@RequestMapping(value = "/upload.do", method = RequestMethod.POST)
public String upLoadFiles(MultipartFile file) { File tempFile = new File("d://multipart.jpg");
try {
file.transferTo(tempFile);
return "success";
} catch (IOException e) {
e.printStackTrace();
return "error";
}
}
结果就不上了,以上就是springmvc中 一些常用的其他技术,如果有错请指出,谢谢!
SpringInAction--SpringMvc高级技术(servlet、filter、multipart)的更多相关文章
- spring-mvc高级技术
Spring MVC高级技术包括但不限于web.xml配置.异常处理.跨重定向请求传递数据 1.web.xml文件的配置 <!DOCTYPE web-app PUBLIC "-//Su ...
- 第7章—SpringMVC高级技术—处理multipart形式的数据
处理multipart形式的数据 MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 Multip ...
- 第7章—SpringMVC高级技术—不用web.xml,而使用java类配置SpringMVC
不用web.xml,而使用java类配置SpringMVC DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置 ...
- Spring学习之旅(九)--SpringMVC高级技术
文件上传 在 Web 应用中,允许用户上传文件是很常见的需求.文件上传通常是采用 multipart 格式,而 DispatcherServlet 并没有任何解析 multipart 请求数据的功能, ...
- 第7章—SpringMVC高级技术—处理异常
处理异常 处理异常 不管发生什么事情,不管是好的还是坏的,Servlet请求的输出都是一个Servlet响应.如果在请求处理的时候,出现了异常,那它的输出依然会是Servlet响应.异常必须要以某种方 ...
- servlet 高级知识之Filter
Filter叫做拦截器, 对目标资源拦截,拦截HTTP请求和HTTP响应,本质是对url进行拦截. 与serlvet不同的是, Filter的初始化是随着服务器启动而启动. 在Filter接口中定义了 ...
- 【Spring】Spring MVC高级技术
前言 前面学习了简单的Spring Web知识,接着学习更高阶的Web技术. 高级技术 Spring MVC配置的替换方案 自定义DispatcherServlet配置 在第五章我们曾编写过如下代码. ...
- 第07章-Spring MVC 的高级技术
Spring MVC 的高级技术 1. Spring MVC配置的替代方案 1.1 自定义DispatcherServlet配置 AbstractAnnotationConfigDispatcherS ...
- Servlet Filter 1
1.Filter简介 )Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图 ...
随机推荐
- IQKeyboardManager第三方库的使用
IQKeyboardManager是iOS中解决键盘弹起遮挡UITextField/UITextView的一种很实用的工具.无需输入任何代码,不需要额外的设置.使用IQKeyboardManager的 ...
- YOGA Tablet 2 1371f 触屏失效,无声卡,蓝牙键盘都无法使用的解决办法
安装驱动! 下载地址 http://www.lenovocare.com.cn/Handler/Download.ashx?fileid=1234 安装后电源管理,声卡,触摸屏即可使用! 蓝牙键盘连接 ...
- [World Wind学习]22.相机高度和瓦片等级计算
在这里我们看到判断Lod的级别主要有三个条件: * 1.相机视角范围,视角范围越大,所包含的tileSize就越大 * 2.相机与瓦片距离,距离越远,所包含的tileSize也就越大 * 3.相机视锥 ...
- Django REST framework 之JWT认证
Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 H ...
- [py]python的深拷贝和浅拷贝
Python深复制浅复制or深拷贝浅拷贝 简单点说 copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明 ...
- 【Cocos2dx 3.x Lua】TileMap使用
1.编辑TileMap地图资源 2.Cocos2dx 3.x Lua中使用TileMap Link: http://codepad.org/P0nFP1Dx local TileMap=clas ...
- sprintf函数的用法
说明1:该函数包含在stdio.h的头文件中,使用时需要加入:#include <stdio.h> 说明2:sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印 ...
- cocos进阶教程(5)各种动画使用心得
Node类 不解释 ActionTimeline类是一个3.0时代的动画类, 案例一 //建立node方案一Data data = FileUtils::getInstance()->getDa ...
- 系统管理命令之logname
logname命令,可以显示自己初次登录到系统中的用户名,主要识别sudo前后情形,与whoami相反. 1.查看该命令的帮助信息. # logname --help 2.查看该命令的版本信息. # ...
- VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)
上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...