这几天有点懒散,还好没有忘记看书,上周去了国家图书馆翻阅了一些和Java相关的书籍,其实这些书都是自己以前看过或者听过,按理来说,不应该看自己已经看过的书籍,应该找一些最新的书籍去看,但是每次走到书架前,我都忍不住驻留几分钟,然后思考要不要将以前看的书再翻阅下,往往我都是被这种心理所战胜,虽然书是相同的书,人是相同的人,但是时间和地点已经不再,看后的感觉也是不一样,读书千万次,千万次的感觉,千万次的想法,我不知道这种读法会有什么好处。
以前读书,一目十行,对于技术的书籍类,直接看下API看下代码,看下如何实现一个功能,而现在缺失十目一行,而且不停的想,有什么办法去实现,然后去看书中的示例,看的过程中往往回想和其它的有没有重叠的,有没有相似的,有没有让人学习的方法,就拿生命周期来说吧,Servlet的生命周期似乎已经滚瓜烂熟,什么init,什么doPost,Destroy,这是开始的时候,因为书籍上是这么说,而自己也就这么记,,其实对于生命周期这些的流程或者逻辑控制,完全自己可以将这些过程写下,在每一个过程中用printIn打印出来(别忘了加上时间标记),相信这种方法比那个死记硬背来的更爽,更直接。
C#中的IHttpHandler也是用来处理Http请求的,而Java中的Servlet也是可以用来处理Http请求的,是否有相似的关系呢?写好后的Servlet 往往是要进行配置的,很多的时候类似一个拦截器,那么IHttpHandler呢?在使用IHttpHandler的时候?是否是也可以配置,让应用程序决定用哪一个?其实是可以的,只不过配置的不是IHttpHandler而是一个IModule的东西,现在想想虽然不是同一个东西,虽然生命周期不一样,但是能隐约感觉到相同的影子。
再来看看JSP,JSP是Servlet的一种简化,使用JSP只需要完成程序员需要输出到客户端的内容,JSP中的Java脚本如何镶嵌到一个类中,也就是说JSP最终是要被编译为一个Class文件,JSP本质上就是一个Servlet,而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。它们两者的区别如下:
1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,JSP中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
下面给一个例子:Servlet下载文件
http://blog.csdn.net/shaojie519/article/details/7361526
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DownLoadServlet extends HttpServlet { public DownLoadServlet() { super(); } public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //处理请求 //读取要下载的文件 File f = new File("E:/好久不见.mp3"); if(f.exists()){ FileInputStream fis = new FileInputStream(f); String filename=URLEncoder.encode(f.getName(),"utf-8"); //解决中文文件名下载后乱码的问题 byte[] b = new byte[fis.available()]; fis.read(b); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Disposition","attachment; filename="+filename+""); //获取响应报文输出流对象 ServletOutputStream out =response.getOutputStream(); //输出 out.write(b); out.flush(); out.close(); } } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here } }
public class DowFileHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { // 打开一个下载对话框 context.Response.ContentType = "image/JPEG"; context.Response.AddHeader("Content-Disposition", "attachment:filename=aaa.jpg"); context.Response.WriteFile("脑残片.jpg"); } public bool IsReusable { get { return false; } } }