文档章节

servlet学习之路

cicue
 cicue
发布于 2015/08/11 23:09
字数 1322
阅读 125
收藏 10

第一个serverlet程序

建立一个dynamic web project 在建立一个包com.h 建立工程Hello

package com.h;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class World extends HttpServlet{

	@Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        // 首先将访问修饰符覆写为public

        // 设置内容类型
         resp.setContentType("text/html");

        PrintWriter out = resp.getWriter();

        out.println("<html><head><title>Hello World Sample</title></head>");
        out.println("<body><h1>Hello World Title<h1><h2>" +new Date().toLocaleString() + "</h2></body></html>");
        out.flush();

    }
}

web.xml

<web-app
servlet>
    <servlet-name>He</servlet-name>
    <servlet-class>com.h.World</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>He</servlet-name><!--  servlet-name 要和上面的保持一致-->
    <url-pattern>/HelloWorld</url-pattern><!--  注意前面要有斜线-->
</servlet-mapping>
</web-app>

工程右键 run

localhost:8080/Hello/HelloWorld  上面/HelloWorld对应He对应上面的He对应com.h.World 在Hello目录下在tomat的默认目录下

生命周期

  1. Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。

  2. init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。

  3. service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

  4. destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

url-pattern三种方式

 1、精确匹配: /directory/file1.jsp
 2、目录匹配: /directory/*
 3、扩展匹配: *.jsp
 <filter>  
    <filter-name>authority</filter-name>  
    <filter-class>com.util.AuthorityFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>authority</filter-name>  
       <url-pattern>/pages/genbill/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
    <filter-name>authority</filter-name>  
    <url-pattern>/pages/cmm/*</url-pattern>  
</filter-mapping>


ServletConfig和ServletContext对象的作用和使用 初始化数据

<servlet>  
        <servlet-name>Servlet_03</servlet-name>  
        <servlet-class>com.enterise.always.servlet.Servlet_03</servlet-class>  
        <init-param>  
            <param-name>name_01</param-name>  
            <param-value>value_01</param-value>  
        </init-param>  
        <init-param>  
            <param-name>name_02</param-name>  
            <param-value>value_02</param-value>  
        </init-param>  
</servlet>  
<servlet-mapping>  
        <servlet-name>Servlet_03</servlet-name>  
        <url-pattern>/servlet/Servlet_03</url-pattern>  
</servlet-mapping>  
<context-param>  
     <param-name>context_param</param-name>  
     <param-value>value3</param-value>  
</context-param>

<init-param>就是初始化的数据  通过getInitParameter获取数据

String s1 = this.getInitParameter("name_02"); 

<context-param>就是初始化的数据  通getServletContext().getInitParameter("congtext_param")获取数据

ServletContext servletContext=this.getServletContext();    //对SevletContext中参数进行操作

servletContext.getAttribute("count");    //获取

servletContext.setAttribute("count",count); //修改

servlet转发技术

//跳转至下一个servlet  
RequestDispatcher dispatcher = context.getRequestDispatcher("/ResulstServlet");         
dispatcher.forward(request, response);

使用forward跳转则后面的response输出则不会执行,而用include来跳转,则include的servlet执行完后,再返回到原来的servlet执行response的输出

servlet 响应Response

setStatus 设置响应行 当中 状态码

setHeader 设置响应头信息

getOutputStream 获得字节流 ---- 输出响应体内容

getWriter 获得字符流 ---- 输出响应体内容

文件拷贝 ---- 字节流 

分析文件内容 --- 字符流 (中文操作 字符流)

常用状态码 

200 请求处理成功

302 客户端重定向

304 客户端访问资源没有被修改,客户端访问本地缓存

404 访问资源不存在

500 服务器内部出错

登陆成功,5秒后自动跳转XX页面 

refresh:3;url=http://www.itcast.cn -------- 3秒后自动跳转http://www.itcast.cn 网站 

<meta content="3;url=/day06/response/demo3/result.html" http-equiv="refresh"> ---- 完成3秒自动跳转 

输出中文信息

response.setCharacterEncoding("utf-8");    这个post,对get不起作用

response.setContentType("text/html;charset=utf-8");  一般使用这个

注意:

1、getOutputStream和getWriter 不能同时使用

2、必须在getOutputStream和getWriter 之前 设置响应 编码 

3、getOutputStream和getWriter 输出内容 是 HTTP响应体 

4、getOutputStream和getWriter 存在缓冲区的 ,在service方法结束时,自动关闭流,flush缓冲区内容


案例六 文件下载

第一种:通过超链接 完成文件下载 

* 如果浏览器可以识别该文件格式,直接打开,只有链接文件浏览器不识别文件格式,才会实现下载 

<a href = "/data/aa.zip">zip 下载</a>  文件zip下载相对目录
<a href = "/data/b.jpg>jpg图片</a>   图片相对目录但不下载直接打开和超链接一样

第二种:通过Servlet程序实现下载 

原理:通过Servlet读取目标程序,将资源返回客户端

通过程序下载文件 设置两个头信息 Content-Type Content-Disposition 

<a href = "/工程目录?filename=aa.zip">zip 下载</a>  文件zip下载相对目录
<a href = "/工程目录?filename=b.jpg>jpg图片</a>   图片相对目录但不下载直接打开和超链接一样

response.setContentType(getServletContext().getMimeType(filename));  ---- 设置文件类型 

response.setHeader("Content-Disposition", "attachment;filename="+ filename); ---- 设置文件以附件形式下载(对于浏览器识别格式文件)

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获得文件名
        String filename = request.getParameter("filename");
        System.out.println(filename);
 
        response.setContentType(getServletContext().getMimeType(filename));
        response.setHeader("Content-Disposition", "attachment;filename="+ filename); 
 
        // 下载 读取目标文件,通过response 将目标文件内容写到客户端
        // 绝对磁盘路径 读取文件
        String fullFilename = getServletContext().getRealPath(
                "/工程目录/" + filename);
        InputStream in = new FileInputStream(fullFilename);
        OutputStream out = response.getOutputStream();
        int b;
        while ((b = in.read()) != - 1) {
            out.write(b);
        }
        in.close();
        out.close();
}


© 著作权归作者所有

下一篇: 工具类
cicue
粉丝 15
博文 111
码字总数 75311
作品 0
徐汇
私信 提问
如何成为一个优秀的JSP程序员

一个普通的错误是把JSP当作简化的Java,它不是,(事实上, JSP是简化的Servlet)程序员通常试着没有学习要求的支持技巧而直接学习JSP。JSP是一个衔接技术,并且成功地连接你需要理解的另外的...

五味格子
2011/05/11
31
0
shtml和jsp是什么 关系呀?

我学习一个java web项目,里面的页面好像都是shtml,为什么要这么写? 这是web.xml里的一段 controller org.springframework.web.servlet.DispatcherServlet 1 controller *.shtml...

Vek_lip
2016/10/26
411
2
SpringFramework之学习javax.servlet.Servlet

注:在阅读下文前,建议先去查看JCP的Servlet规范。 1.先来看Servlet接口中定义的方法 图1 Servlet接口中定义的方法 Servlet life cycle:每个Servlet都会经历初始化、接收请求、终止服务,分...

汉斯-冯-拉特
2018/07/26
10
0
tomcat 5.5 部署项目报错 关于Filter的错误。。

我在tomcat7.0部署没不报错,但是再tomcat5.5就会报错。。 listener.ContextListener UrlRewriteFilter org.tuckey.web.filters.urlrewrite.UrlRewriteFilter logLevel WARN UrlRewriteFilte......

庄泽锐
2014/03/06
1K
5
Jsp 和 Servlet 有什么不同?

面试中被问到了 Jsp 和 Servlet 有什么不同?在这里总结分享下。 回答思路先分别进行基本介绍,然后分析说明两者相同点和不同点。 基本介绍 Servlet: Servlet 是一种服务器端的Java应用程序...

几个栗子
2018/08/22
154
3

没有更多内容

加载失败,请刷新页面

加载更多

iOS苹果应用IPA一键签名工具及重签教程

开心签名工具,是一款跨平台ios签名和重签名工具。 同时支持在windows、linux、mac运行,数据同步,方便使用及管理! 开心重签名工具官网 功能特点 1、支持图形界面及命令行重签(部署到服务...

tintong
20分钟前
3
0
2.4G有源卡核心芯片供应商

有源2.4G RFID的防盗标签,在与无源标签相比较,通信距离远,通信时效高。我司的SI24R2E这颗芯片专门为2.4G有源标签而设计,具有低功耗,发送距离远,厂商设计简单等优势;广泛应用于现在城市...

文刀石
26分钟前
2
0
设置Ubuntu16.04启动为命令行界面

1. 修改/etc/default/grub文件,将GRUB_CMDLINE_LINUX_DEFAULT设置成”quiet splash 3” 2. 使用命令update-grub使得在/boot下重新生成GRUB2配置文件。 3. 重启...

JosiahMg
26分钟前
3
0
C++基础知识点

计算机语言 计算机不能理解高级语言,只能理解机器语言,必须要将高级语言翻译成机器语言,翻译的方式有两种,一种是编译,一种是解释 解释型语言,在运行程序时进行翻译,每个语句在执行时逐...

大瑞清_liurq
32分钟前
3
0
EFCore 多条数据更新不能同时savechanges()的解决方法

1 在ModelContext定义下增加var transaction = ctx.Database.BeginTransaction(); 1.2 在最后一个SaveChanges()后增加transaction.Commit(); 3 在finally的if (sMsgCode != "")分支中增加tra......

_Somuns
36分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部