Servlet3.0

一、要求
MyEclipes10.0或以上版本!
发布到Tomcat7.0或以上版本!
二、步骤
创建JavaEE6.0应用

-------------------------------------------
三、概述
*注解代替web.xml配置文件
*异步处理
*对上传的支持

Servlet3.0在市场上没有应用!

--------------------------------------------
四、注解替代配置文件
1、删除web.xml
2、在servlet类上添加@WebServlet(urlPatterns={"/AServlet"})

package cn.itcast.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /*
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>cn.itcast.web.servlet.AServlet</servlet-class>
<init-param>
<param-name>p1</param-name>
<param-value>v1</param-value>
</init-param>
<init-param>
<param-name>p2</param-name>
<param-value>v2</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
<url-pattern>/AAServlet</url-pattern>
</servlet-mapping>
*/
@WebServlet(urlPatterns="/AServlet",
initParams={ //这个既然修改不了,为什么不直接在servlet对应地方书写呢,所以无太大意义,一般不适用
@WebInitParam(name="p1",value="v1"),
@WebInitParam(name="p2",value="v2"),
},
loadOnStartup=1
)
public class AServlet extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("hello servlet3.0!");
resp.getWriter().print("hello 3.0!!");
}
}

总结:
注解的优缺点:配置信息少,不方便修改
3、在Filter类上面添加@WebFilter(urlPattern="/AFilter")

package cn.itcast.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter; @WebFilter(urlPatterns="/*")
public class AFilter implements Filter{ @Override
public void destroy() { } @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("哈哈,看到我了没有!");
arg2.doFilter(arg0, arg1);
} @Override
public void init(FilterConfig arg0) throws ServletException { } }

4、在Listener类上添加@WebListener

package cn.itcast.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; @WebListener
public class AListener implements ServletContextListener{ @Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("死掉了!");
} @Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("出生了!");
} }

五、异步处理
1、什么是异步处理
原来,在服务器没有结束响应之前,客户端浏览器是看不到响应内容的,只有响应结束时候,浏览器才能显示结果!
现在异步处理的而作用:在服务器开始响应后,浏览器就可以看到响应内容,不用等待响应结束

2、实现异步的步骤
*得到AsyncContext,它是异步上下文对象
AsyncContext ac=request.startAsync(request,response);
*给上下文一个Runnable对象,启动它!(给上下文一个任务,让它完成!)
ac.start(new Runnable(){
public void run(){
...
}
});

*@WebServlet(urlPattern="/AServlet",asyncSupported=true)
*resp.setContentType("text/html;charset=utf-8");
*IE如果不能正常输出,这说明响应体大小不足521B,那么你多补充一点废话就可以了
*AstnContext#complete():通知Tomcat我们异步线程已经执行完毕了

package cn.itcast.web.servlet;

import java.io.IOException;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns="/AServlet",asyncSupported=true)
public class AServlet extends HttpServlet{ /* 不异步
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().print("hello");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
resp.getWriter().print("word");
resp.getWriter().flush();
}
*/
public void doGet(HttpServletRequest req, final HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
for(int i=0;i<=512;i++){
resp.getWriter().print("a");
}
/*
* 得到异步上下文对象
*/
final AsyncContext ac=req.startAsync(req, resp);
/*
* 给上下文对象一个Runnable对象,让它执行这个任务
*/
ac.start(new Runnable(){
public void run(){
println("现在马上开始!<br/>",resp);
sleep(2000);
for(char c='A';c<'Z';c++){
println(c+"",resp);
sleep(250);
}
//通知Tomcat该线程已经结束了
ac.complete();
}
});
}
public void println(String text,HttpServletResponse resp){
try {
resp.getWriter().print(text);
resp.getWriter().flush();
} catch (IOException e) {
} }
public void sleep(long ms){
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
}
}
}

----------------------------------------
六、上传支持
1、上传
*上传时对表单的要求
method="post"
enctype="multipart/form-data",它的默认值是:application/x-www-form-urlencoded
<input type="file" name="必须给"/>

*上传Servlet的使用
request.getParameter()相关不能再使用
request.getInputStream()使用它来获取整个表单的数据

*commons-fileupload
创建工厂
解析器
使用解析器得到List<FileItem>

=====================
Servlet3.0对上传提供了支持:
*表单不变
*在Servlet中不需要再使用commons-fileupload,而是使用Servlet3.0提供的上传接口

=====================
上传的步骤:
*使用request.getPart("字段名"),得到Part实例
*Part:
>String getContentType():获取上传文件的MIME类型
>String getName():获取表单项的名称,不是文件名称
>String getHeader(String header):获取指定头的值
>long getSize():获取上传文件的大小
>InputStream getInputStream():获取上传文件的内容
>void write(String fileName):把上传文件保存到指定路径下
*默认Servlet是不支持使用上传组件:需要给Servlet添加一个注解:@MultipartConfig

它没有提供获取上传文件名称的方法
这需要我们自己从Content-Disposition中截取

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'form.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<h1>注册</h1>
<form action="<c:url value='/AServlet'/>" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br/>
简 历:<input type="file" name="resume"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>

form.jsp

package cn.itcast.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part; @WebServlet(urlPatterns="/AServlet")
@MultipartConfig
public class AServlet extends HttpServlet{ public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
/*
* getParameter()可以使用了
*/
String username=req.getParameter("username");
/*
* 获取文件表单字段
*/
Part part=req.getPart("resume");
/*
* 从Part中获取需要的数据
*/
//获取上传文件的MIME类型
System.out.println(part.getContentType());
//获取上传文件的字节数
System.out.println(part.getSize());
//获取文件字段名称
System.out.println(part.getName());
//获取头,这个头包含了上传文件名称
System.out.println(part.getHeader("Content-Disposition"));
String filename=part.getHeader("Content-Disposition");
// filename=filename.split("filename=")[1].split("\"")[1];
int start=filename.lastIndexOf("filename=\"");
int end=filename.length()-1;
filename=filename.substring(start,end);
System.out.println(filename);
//保存上传文件
part.write("C:/"+filename); }
}

AServlet.java

初次接触Servlet3.0的更多相关文章

  1. [译]servlet3.0与non-blocking服务端推送技术

    Non-blocking(NIO)Server Push and Servlet 3 在我的前一篇文章写道如何期待成熟的使用node.js.假定有一个框架,基于该框架,开发者只需要定义协议及相关的ha ...

  2. 初次接触GWT,知识点总括

    初次接触GWT,知识点概括 前言 本人最近开始研究 GWT(Google Web Toolkit) ,现将个人的一点心得贴出来,希望对刚开始接触 GWT的程序员们有所帮助,也欢迎讨论,共同进步. 先说 ...

  3. [Docker]初次接触

    Docker 初次接触 近期看了不少docker介绍性文章,也听了不少公开课,于是今天去官网逛了逛,发现了一个交互式的小教程于是决定跟着学习下. 仅仅是把认为重点的知识记录下来,不是非常系统的学习和笔 ...

  4. 初次接触:DirectDraw

    第六章 初次接触:DirectDraw 本章,你将初次接触DirectX中最重要的组件:DirectDraw.DirectDraw可能是DirectX中最强大的技术,因为其贯穿着2D图形绘制同时其帧缓 ...

  5. 初次接触scrapy框架

    初次接触这个框架,先订个小目标,抓取QQ首页,然后存入记事本. 安装框架(http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html) ...

  6. 关于servlet3.0中的异步servlet

    刚看了一下维基百科上的介绍,servlet3.0是2009年随着JavaEE6.0发布的: 到现在已经有六七年的时间了,在我第一次接触java的时候(2011年),servlet3.0就已经出现很久了 ...

  7. 孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境

    孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境 (完整学习过程屏幕记录视频地址在文末) 学习Python我肯定不会错过图片文字的识别,当然更重要的是简单的验证码识别了,今天 ...

  8. OC 初次接触

    初次接触ObjC时,会发现许多和其它语言不同的地方,会看到很多的+,- ,[ ,] ,@, NS等符号,这些符号在以后的编程中将经常看到,这部分内容在第二节中介绍.先熟悉一下ObjC的代码: #imp ...

  9. Servlet3.0的动态

    动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用.这也是注解的另外一种替代方式. 动态的添加有两种,一种是基于ContextListener的,另 ...

随机推荐

  1. eclipse导入web工程变成Java工程,解决方案

    经常在eclipse中导入web项目时,出现转不了项目类型的问题,导入后就是一个java项目. 解决步骤: 1.进入项目目录,可看到.project文件,文本编辑器打开. 2.找到<nature ...

  2. 【BZOJ4930】棋盘 拆边费用流

    [BZOJ4930]棋盘 Description 给定一个n×n的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置(x,y),(u,v)能互相攻击当前仅 当满足以下两个条件: 1:x=u或y ...

  3. EasyNVR无插件H5/HLS/m3u8直播解决方案中Windows系统服务启动错误问题的修复:EasyNVR_Service 服务因 函数不正确。 服务特定错误而停止。

    最近在做某地市移动公司景观直播的项目时,遇到一个问题,当我们部署EasyNVR为系统服务后,居然出现了无法启动服务的现象,表面上看,提示是系统服务启动失败,实际通过查看windows 系统日志: 查找 ...

  4. nginx中使用waf防火墙

    1.安装依赖 yum install -y readline-devel ncurses-devel 2.安装Lua # .tar.gz # cd lua- # make linux # make i ...

  5. Java编程中的一些常见问题汇总

    转载自  http://macrochen.iteye.com/blog/1393502 每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题.虽然一般 ...

  6. java堆分析神器MAT

    Memory Analyzer(MAT) 基于Eclipse的软件 http://www.eclipse.org/mat/

  7. 如何判断移动终端访问还是PC访问?

    我们经常需要知道访问网站的设备是移动终端还是PAD还是PC,下面给出判断的java代码供参考.实现的原理就是获取HTTP消息头里User-Agent和x-wap-profile,User-下面是Use ...

  8. ceph基本架构简述

    1. 介绍 云硬盘是IaaS云平台的重要组成部分,云硬盘给虚拟机提供了持久的块存储设备.目前的AWS 的EBS(Elastic Block store)给Amazon的EC2实例提供了高可用高可靠的块 ...

  9. 中国移动OnetNet云平台 使用WIFI模块ESP8266 TCP非透传模式传输数据流步骤

    测试使用工具: WIFI模块型号:ESP8266 https://item.taobao.com/item.htm?spm=a1z10.1-c.w137712-175513579.2.btbD9X&a ...

  10. linux sort按照指定列排序

    sort怎样按指定的列排序0000 27189 41925425065f 15 419254250663 7 419254250675 5 419254250691 76 419254250693 2 ...