Servlet与JSP核心编程 ---- 6

第七章 服务器响应的生成:HTTP响应报头

 

1.任意响应报头的设置

 

public void setHeader(String headerName,

String headerValue)

– 设定任意的报头

 public void setDateHeader(String name,

long millisecs)

– 将自1970年以来的毫秒数转换成GMT格式日期字符串

 public void setIntHeader(String name,

int headerValue)

– 可以省去在调用setHeader之前将int转换成字符串的麻

 addHeader, addDateHeader, addIntHeader

– 增加新报头,而非替换已有的报头

 

 

2.普通响应报头的设置

 

setContentType

– 设定Content-Type报头。

– servlet几乎总会用到这个报头。

– 参见常见MIME类型的表格。

• setContentLength

– 设定Content-Length报头。

– 用于持续性HTTP连接。

– 参见Connection请求报头。

• addCookie

– 为Set-Cookie报头增加一个值。

– 参见介绍cookie的部分。

• sendRedirect

– 设定Location报头(以及改变状态代码)。

 

 

3.常见MIME类型

 

 

类型                                                  含意

application/msword                         Microsoft Word document

application/octet-stream                 Unrecognized or binary data

application/pdf                                Acrobat (.pdf) file

application/postscript                      PostScript file

application/vnd.ms-excel                 Excel spreadsheet

application/vnd.ms-powerpoint        Powerpoint presentation

application/x-gzip                           Gzip archive

application/x-java-archive               JAR file

application/x-java-vm                      Java bytecode (.class) file

application/zip                                 Zip archive

audio/basic S                                   ound file in .au or .snd format

audio/x-aiff                                      AIFF sound file

audio/x-wav                                    Microsoft Windows sound file

audio/midi                                        MIDI sound file

text/css HTML                                  cascading style sheet

text/html                                          HTML document

text/plain                                         Plain text

text/xml                                           XML document

image/gif                                         GIF image

image/jpeg                                      JPEG image

image/png                                       PNG image

image/tiff                                         TIFF image

video/mpeg                                     MPEG video clip

video/quicktime                               QuickTime video clip

 

 

 

 

4.常见HTTP 1.1响应报头

 

• Cache-Control (1.1) 和Pragma (1.0)

– no-cache值阻止浏览器缓存页面。

• Content-Disposition

– 通过这个报头,可以请求浏览器询问用户将响应存储到磁盘上

给定名称的文件中。

Content-Disposition: attachment; filename=file-name

• Content-Encoding

– 文档的编码方式。参见之前压缩的例子。

• Content-Length

– 响应中的字节数。

– 参见前面幻灯片中的setContentLength。

– 使用ByteArrayOutputStream在发送文档前对文档进行缓冲,这

样才能够确定数据的大小。参见有关Connection请求报头的讨

论。

 

• Content-Type

– 返回文档时所采用的MIME类型。

– 使用setContentType设置这个报头。

• Expires

– 特定的一段时间,这段时间后应该将文档认作是过期

,不应该再继续缓存。

– 使用setDateHeader设置这个报头。

• Last-Modified

– 文档最后被改动的时间。

– 不要直接设置这个报头;而应该提供getLastModified

方法。参见书中的博彩数字的例子(第3章)。

 

• Location

– 浏览器应该重新连接到的URL。

– 不要直接设置这个报头,而要使用sendRedirect进行设

定。

• Refresh

– 多少秒后浏览器应该重新载入页面。同时还可以包括

应该连接到的URL。参见后面的例子。

• Set-Cookie

– 浏览器应该记下来的cookie。不要直接设置这个报头

;而应该使用addCookie。参见下一节。

• WWW-Authenticate

– 授权的类型和范围需要在Authorization报头中给出。

参见More Servlets & JSP 中有关安全的章节。

 

 

 

 

 

You use the shorthand

setContentType method to set the Content-Type header, and the MIME type

for Excel spreadsheets is application/vnd.ms-excel. So, to generate Excel

spreadsheets, just do:

 

 

response.setContentType("application/vnd.ms-excel");
PrintWriter out = response.getWriter();

 package coreservlets;

 

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/** Servlet that creates Excel spreadsheet comparing
* apples and oranges.
*/
public class ApplesAndOranges extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/vnd.ms-excel");
PrintWriter out = response.getWriter();
out.println("\tQ1\tQ2\tQ3\tQ4\tTotal");
out.println("Apples\t78\t87\t92\t29\t=SUM(B2:E2)");
out.println("Oranges\t77\t86\t93\t30\t=SUM(B3:E3)");
}
}
 

 

 

 

 

 

处理长时间运行的servlet时我们需要下述内容:

 

• 不同请求间存储数据的方式。

– 对于不专门针对任意某个客户的数据,可以将它存储在servlet

的字段中(实例变量)。

– 对于专属于某个用户的数据,则要将它存储在HttpSession对象

中。

• 参见随后有关会话跟踪的课程。

– 对于需要为其他servlet或JSP页面访问的数据(和用户无关),

可将其存储到ServletContext中。

• 在响应发送给用户之后,保持计算继续运行的方法。

– 这项任何比较简单:启动一个线程。唯一要注意的是:将线程

的优先级设为比较低的值,这样才不会拖慢整个服务器的运行

• 在更新结果就绪后将它们发送给浏览器的方法。

– 使用Refresh报头告诉浏览器,让它请求更新。

 

 

 

 

使用servlet生成JPEG图像

 

1. 创建一个BufferedImage

2. 在BufferedImage上绘制内容

3. 设置Content-Type响应报头

response.setContentType("image/jpeg");

4. 获取输出流

OutputStream out = response.getOutputStream

5. 以JPEG格式将BufferedImage发送到输出流

 

 

 

try {
ImageIO.write(image, "jpg", out);
} catch(IOException ioe) {
System.err.println("Error writing JPEG file: "
+ ioe);
}

 

 

package coreservlets;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
/** Servlet that generates JPEG images representing
* a designated message with an oblique-shadowed
* version behind it.
*/
public class ShadowedText extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String wantsList = request.getParameter("showList");
if (wantsList != null) {
showFontList(response);
} else {
String message = request.getParameter("message");
if ((message == null) || (message.length() == 0)) {
message = "Missing 'message' parameter";
}
String fontName = request.getParameter("fontName");
if ((fontName == null) || (fontName.length() == 0)) {
fontName = "Serif";
}
String fontSizeString = request.getParameter("fontSize");
int fontSize;
try {
fontSize = Integer.parseInt(fontSizeString);
} catch(NumberFormatException nfe) {
fontSize = 90;
}
response.setContentType("image/jpeg");
MessageImage.writeJPEG
(MessageImage.makeMessageImage(message,
fontName,
fontSize),
response.getOutputStream());
}
}private void showFontList(HttpServletResponse response)
throws IOException {
PrintWriter out = response.getWriter();
String docType =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
"Transitional//EN\">\n";
String title = "Fonts Available on Server";
out.println(docType +
"<HTML>\n" +
"<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=CENTER>" + title + "</H1>\n" +
"<UL>");
String[] fontNames = MessageImage.getFontNames();
for(int i=0; i<fontNames.length; i++) {
out.println(" <LI>" + fontNames[i]);
}
out.println("</UL>\n" +
"</BODY></HTML>");
}
}

 

 

package coreservlets;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
/** Utilities for building images showing shadowed messages.
* <P>
* Requires JDK 1.4 since it uses the ImageIO class.
* JDK 1.4 is standard with J2EE-compliant app servers
* with servlets 2.4 and JSP 2.0. However, standalone
* servlet/JSP engines require only JDK 1.3 or later, and
* version 2.3 of the servlet spec requires only JDK
* 1.2 or later. So, although most servers run on JDK 1.4,
* this code is not necessarily portable across all servers.
*/
public class MessageImage {
/** Creates an Image of a string with an oblique
* shadow behind it. Used by the ShadowedText servlet.
*/
public static BufferedImage makeMessageImage(String message,
String fontName,
int fontSize) {
Font font = new Font(fontName, Font.PLAIN, fontSize);
FontMetrics metrics = getFontMetrics(font);
int messageWidth = metrics.stringWidth(message);
int baselineX = messageWidth/10;
int width = messageWidth+2*(baselineX + fontSize);
int height = fontSize*7/2;
int baselineY = height*8/10;
BufferedImage messageImage =
new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D)messageImage.getGraphics();
g2d.setBackground(Color.white);
g2d.clearRect(0, 0, width, height);
g2d.setFont(font);
g2d.translate(baselineX, baselineY);
g2d.setPaint(Color.lightGray);
AffineTransform origTransform = g2d.getTransform();
g2d.shear(-0.95, 0);
g2d.scale(1, 3);
g2d.drawString(message, 0, 0);
g2d.setTransform(origTransform);
g2d.setPaint(Color.black);
g2d.drawString(message, 0, 0);
return(messageImage);
}
public static void writeJPEG(BufferedImage image,
OutputStream out) {
try {
ImageIO.write(image, "jpg", out);
} catch(IOException ioe) {
System.err.println("Error outputting JPEG: " + ioe);
}
}
public static void writeJPEG(BufferedImage image,
File file) {
try {
ImageIO.write(image, "jpg", file);
} catch(IOException ioe) {
System.err.println("Error writing JPEG file: " + ioe);
}
}
public static String[] getFontNames() {
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
return(env.getAvailableFontFamilyNames());
}
/** We need a Graphics object to get a FontMetrics object
* (an object that says how big strings are in given fonts).
* But, you need an image from which to derive the Graphics
* object. Since the size of the "real" image will depend on
* how big the string is, we create a very small temporary
* image first, get the FontMetrics, figure out how
* big the real image should be, then use a real image
* of that size.
*/
private static FontMetrics getFontMetrics(Font font) {
BufferedImage tempImage =
new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D)tempImage.getGraphics();
return(g2d.getFontMetrics(font));
}
}
 

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>JPEG Generation Service</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H1 ALIGN="CENTER">JPEG Generation Service</H1>
Welcome to the <I>free</I> trial edition of our JPEG
generation service. Enter a message, a font name,
and a font size below, then submit the form. You will
be returned a JPEG image showing the message in the
designated font, with an oblique "shadow" of the message
behind it. Once you get an image you are satisfied with,
right-click
on it (or click while holding down the SHIFT key) to save
it to your local disk.
<P>
The server is currently on Windows, so the font name must
be either a standard Java font name (e.g., Serif, SansSerif,
or Monospaced) or a Windows font name (e.g., Arial Black).
Unrecognized font names will revert to Serif. Press the
"Show Font List" button for a complete list.
<FORM ACTION="/servlet/coreservlets.ShadowedText">
<CENTER>
Message:
<INPUT TYPE="TEXT" NAME="message"><BR>
Font name:
<INPUT TYPE="TEXT" NAME="fontName" VALUE="Serif"><BR>
Font size:
<INPUT TYPE="TEXT" NAME="fontSize" VALUE="90"><P>
<INPUT TYPE="SUBMIT" VALUE="Build Image"><P>
<INPUT TYPE="SUBMIT" NAME="showList" VALUE="Show Font List">
</CENTER>
</FORM>
</BODY></HTML>
 

 

package coreservlets;
import java.io.*;
public class ImageTest {
public static void main(String[] args) {
String message = "Testing";
String font = "Arial";
if (args.length > 0) {
message = args[0];
}
if (args.length > 1) {
font = args[1];
}
MessageImage.writeJPEG
(MessageImage.makeMessageImage(message, font, 40),
new File("ImageTest.jpg"));
}
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值