当前位置: 首页 > news >正文

做封面网站/西安网站关键词优化费用

做封面网站,西安网站关键词优化费用,wordpress底部链接,做网站兼职Servlet 3.0 新特性概览1.Servlet、Filter、Listener无需在web.xml中进行配置,可以通过Annotation进行配置;2.模块化编程,即将各个Servlet模块化,将配置文件也分开配置。3.Servlet异步处理,应对复杂业务处理&#xff1…

Servlet 3.0 新特性概览

1.Servlet、Filter、Listener无需在web.xml中进行配置,可以通过Annotation进行配置;

2.模块化编程,即将各个Servlet模块化,将配置文件也分开配置。

3.Servlet异步处理,应对复杂业务处理;

4.异步Listener,对于异步处理的创建、完成等进行监听;

5. 文件上传API简化;

tomcat 7.0.X 支持Servlet 3.0

一、Annotation支持

1.Servlet

原本Servlet开发完后,必须在web.xml中配置如下代码:

[html] view plaincopy

现在只需要在java源文件的Servlet类前面加上:

@WebServlet(name="",urlPatterns={""},initParams={@WebInitParam(name="",value=""),loadOnStartup=1})

public class FirstServlet extends HttpServlet{}

代码示例:

实现一个最简单的Servlet。

[java] view plaincopypackageorg.servlet;

importjava.io.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.servlet.annotation.*;

/*

name == 

urlPatterns == ,

loadOnStartup == 

initParam == 

name == 

value == 

*/

@WebServlet(name="HelloServlet",urlPatterns={"/HelloServlet"},loadOnStartup=1,

initParams={

@WebInitParam(name="name",value="xiazdong"),

@WebInitParam(name="age",value="20")

})

publicclassHelloServletextendsHttpServlet{

publicvoidinit(ServletConfig config)throwsServletException{

super.init(config);

}

publicvoidservice(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{

request.setCharacterEncoding("GBK");

ServletConfig config = getServletConfig();

PrintWriter out = response.getWriter();

out.println("");

out.println("

");

out.println("Hello world"+"
");

out.println(config.getInitParameter("name"));

out.println("");

out.println("");

}

}

这样的话只需要将class文件放入WEB-INF\classes 中,不需要再web.xml中作任何改动就完成部署;

2.Filter

原本Filter的配置如下:

[html] view plaincopy

现在只需要在java源文件的Filter类前面加上

@WebFilter(filterName="",urlPattern={"/"});

3.Listener

原本在web.xml中配置如下:

[html] view plaincopy

现在只需要在java源文件的Listener类前面加上@WebListener即可;

二、web模块化

原本一个web应用的任何配置都需要在web.xml中进行,因此会使得web.xml变得很混乱,而且灵活性差,因此Servlet 3.0可以将每个Servlet、Filter、Listener打成jar包,然后放在WEB-INF\lib中;注意各自的模块都有各自的配置文件,这个配置文件的名称为  web-fragment.xml ;

制作一个Servlet模块的步骤:

1.编写Servlet,并编译;

2.将此编译class文件及所在包通过jar包命令打成jar包;

3.将此jar包用winrar打开,并将其中的META-INF中的manifest删除并添加 web-fragment.xml;

4.将此jar包放入WEB-INF\lib中即可;

web-fragment.xml注意点:

1.根元素为;

2.表示模块名称;

3.是此模块的加载顺序;

4.表示第一个加载;

5.A表示比A后面加载;

6.可以在里面部署listener、filter、servlet

当然可以不设置任何的模块加载顺序;

代码示例:

配置两个listener模块;

FirstListener.java

[java] view plaincopypackageorg.listener;

importjavax.servlet.annotation.*;

importjavax.servlet.http.*;

importjavax.servlet.*;

importjava.util.*;

importjava.sql.*;

importjavax.naming.*;

publicclassFirstListenerimplementsServletRequestListener{

publicvoidrequestInitialized(ServletRequestEvent event){

System.out.println("FirstListener created");

}

publicvoidrequestDestroyed(ServletRequestEvent event){

System.out.println("FirstListener destroyed");

}

}

FirstListener 的 web-fragment.xml内容:

[html] view plaincopy<?xmlversion ="1.0"encoding="ISO-8859-1"?>

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

version="3.0">

FirstListener

org.listener.FirstListener

SecondListener.java

[java] view plaincopypackageorg.listener;

importjavax.servlet.annotation.*;

importjavax.servlet.http.*;

importjavax.servlet.*;

importjava.util.*;

importjava.sql.*;

importjavax.naming.*;

publicclassSecondListenerimplementsServletRequestListener{

publicvoidrequestInitialized(ServletRequestEvent event){

System.out.println("SecondListener created");

[java] view plaincopy}

publicvoidrequestDestroyed(ServletRequestEvent event){

System.out.println("SecondListener destroyed");

}

}

SecondListener的 web-fragment.xml内容是:

[html] view plaincopy<?xmlversion ="1.0"encoding="ISO-8859-1"?>

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

version="3.0">

SecondListener

[html] view plaincopyorg.listener.SecondListener

FirstListener

b-fragment>

然后分别打成jar包,放入 WEB-INF\lib中即可;

随便访问一个web应用,然后发现 tomcat控制台输出:

看出先加载FirstListener,再加载SecondListener;

三、Servlet 异步处理

Servlet在MVC中作为控制器,控制器负责分发任务给MODEL完成,然后把结果交给JSP显示;

而如果有许多MODEL,其中有一个MODEL处理时间很长,则会导致整个页面的显示很慢;

异步处理关键点:将复杂业务处理另外开一个线程,而Servlet将执行好的业务先送往jsp输出,等到耗时业务做完后再送往JSP页面;

一句话:先显示一部分,再显示一部分;

异步处理Servlet的注意点是:

1.需要在Annotation中注明 asyncSupported=true;

[java] view plaincopypackageorg.sync;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.servlet.annotation.*;

importjava.io.*;

@WebServlet(name="AsyncServlet",urlPatterns={"/AsyncServlet"},asyncSupported=true)

publicclassAsyncServletextendsHttpServlet{

publicvoidservice(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{

request.setCharacterEncoding("GBK");

response.setContentType("text/html;charset=GBK");

PrintWriter out = response.getWriter();

out.println("");

out.println("

");

out.println("====页面开始====


");

AsyncContext actx = request.startAsync();

actx.setTimeout(30*3000);

actx.start(newMyThread(actx));

out.println("====页面结束====


");

out.println("");

out.println("");

out.flush();

}

}

classMyThreadimplementsRunnable{

privateAsyncContext actx;

publicMyThread(AsyncContext actx){

this.actx = actx;

}

publicvoidrun(){

try{

Thread.sleep(5*1000);//消耗5秒

actx.dispatch("/1.jsp");

}

catch(Exception e){}

}

}

1.jsp

[html] view plaincopy

out.println("======复杂业务方法====");

%>

四、异步监听器

异步监听器用来监听异步处理事件;即“三”中讲到的知识点;

此监听器类似于ServletContextListener的机制;

只需要实现AsyncListener接口即可;

此接口有4个方法:

public void onStartAsync(AsyncEvent event)throws IOException;

public void onComplete(AsyncEvent event);

public void onTimeout(AsyncEvent event);

public void onError(AsyncEvent event);

以下是监听器实现的代码:

[java] view plaincopypackageorg.listener;

importjavax.servlet.annotation.*;

importjavax.servlet.http.*;

importjavax.servlet.*;

importjava.util.*;

importjava.sql.*;

importjavax.naming.*;

importjava.io.*;

publicclassMyListenerimplementsAsyncListener{

publicvoidonStartAsync(AsyncEvent event)throwsIOException{}

publicvoidonComplete(AsyncEvent event){

System.out.println("-----------------------Complete");

}

publicvoidonTimeout(AsyncEvent event){

}

publicvoidonError(AsyncEvent event){}

}

在Servlet异步处理处添加:

actx.addListener(new MyListener());就可以添加监听器,每当异步处理完成时就会触发onComplete()事件,输出Complete;

五、文件上传改进API

原本文件上传时通过 common-fileupload或者SmartUpload,上传比较麻烦,在Servlet 3.0 中不需要导入任何第三方jar包,并且提供了很方便进行文件上传的功能;

注意点:

1. html中 表示文件上传控件;

2. form的 enctype="multipart/form-data";

3.在Servlet类前加上 @MultipartConfig

4.request.getPart()获得;

下面是一个文件上传的例子:

upload.html

[html] view plaincopy

UploadServlet.java

[java] view plaincopypackageorg.servlet;

importjava.io.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.servlet.annotation.*;

@WebServlet(name="UploadServlet",urlPatterns={"/upload"})

@MultipartConfig

publicclassUploadServletextendsHttpServlet{

publicvoidinit(ServletConfig config)throwsServletException{

super.init(config);

}

publicvoidservice(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{

Part part = request.getPart("file");

PrintWriter out = response.getWriter();

out.println("此文件的大小:"+part.getSize()+"
");

out.println("此文件类型:"+part.getContentType()+"
");

out.println("文本框内容:"+request.getParameter("name")+"
");

out.println(UploadUtil.getFileName(part)+"
");

part.write("F:\\1."+UploadUtil.getFileType(part));

}

}

UploadUtil.java

由于在Servlet 3.0中很难获取上传文件的类型,因此我写了两个工具类,可以方便开发;

[java] view plaincopy/**

* 此工具类只适用于Servlet 3.0

* 为了弥补 Servlet 3.0 文件上传时获取文件类型的困难问题

*

* @author xiazdong

*/

importjavax.servlet.http.*;

publicclassUploadUtil{

publicstaticString getFileType(Part p){

String name = p.getHeader("content-disposition");

String fileNameTmp = name.substring(name.indexOf("filename=")+10);

String type = fileNameTmp.substring(fileNameTmp.indexOf(".")+1,fileNameTmp.indexOf("\""));

returntype;

}

publicstaticString getFileName(Part p){

String name = p.getHeader("content-disposition");

String fileNameTmp = name.substring(name.indexOf("filename=")+10);

String fileName = fileNameTmp.substring(0,fileNameTmp.indexOf("\""));

returnfileName;

}

}

0 0

http://www.lbrq.cn/news/1559521.html

相关文章:

  • 响应式网站 哪些/刷网站排名软件
  • WordPress分类置顶插件/关键词优化排名软件案例
  • 格尔木城乡建设规划局网站/网络营销的应用研究论文
  • 专业建站推荐/谷歌推广网站
  • 用java做的网站怎么发布/微信社群营销推广方案
  • 广州番禺区房价/谷歌seo技巧
  • 网站的验证码是怎么做的/企业网站推广渠道
  • 外贸网站建设设计/微信搜一搜怎么做推广
  • 秦皇岛属于哪个省哪个市的/网站seo优化培训
  • 室外建筑网站/优化营商环境的金句
  • 外管局网站做延期收汇报告/合肥做网站的公司有哪些
  • 网页模板免费下载源代码/佛山旺道seo
  • 响应网站开发/使用软件提高百度推广排名
  • 移动开发网站开发区别/不死鸟分享友情链接
  • 化工企业建网站/百度手机助手应用商店
  • 做外贸生意在哪个网站/成都seo网站qq
  • 深圳国贸网站建设/毕业设计网站
  • 给自己企业怎么做网站/域名信息查询系统
  • 红色扁平化网站/网店推广有哪些方法
  • 企业建设门户网站的目的/长春百度快速优化
  • 怎么样提高网站排名/武汉网络推广优化
  • 企业网站 微博模块/搜索引擎优化培训班
  • 个人简历html代码/优化网址
  • 企业展厅设计公司收费/东莞网络营销优化
  • 广州番禺专业建网站/宁波正规seo快速排名公司
  • 网站服务类型/seo网站查询
  • 网络网站制作技巧/热搜词工具
  • 免费视频网站制作/新冠不易感染三种人
  • 中国建设银行总行网站/搜索引擎优化与关键词的关系
  • 网站建设服务费计入会计科目/网站关键词搜索
  • fastadmin 后台列表自定义搜索
  • 从零开始大模型之实现GPT模型
  • IOMMU多级页表查找的验证
  • Sklearn 机器学习 邮件文本分类 加载邮件数据
  • 计算机存储器分类和层次结构详解
  • Matplotlib直线绘制:从基础到三维空间的高级可视化