承接上一节 jsp page 指令 的讲解,这一次将会谈到另外一个指令 include 和 其他的一些相关的知识。
include 指令用于将指定的文件包含到容器当中,包含操作是在 jsp 文件编译时发生的,包含过程是静态的。包含的文件可以是 jsp、html,java程序或其他静态文本文件。include 指令的语法格式如下:
<%@ include file="file-URL" %>
其中,file-url 为包含的文件名及其路径,执行include 指令的效果相当于将 file-url 文件的内容嵌入到指令所在的文职。这种嵌入操作是在编译前一刻发生,随后对嵌入后得到的 jsp 文件进行编译,编译后形成的 servlet 融合了包含者和被包含着,他们在 servlet 中不再有包含和被包含的区别。
被插入的文件要求满足一下条件:
(1)被插入的文件必须与当前 jsp 页面在同一 web 目录下
(2)被插入的文件与当前 jsp 页面合并后的jsp 页面必须符合 jsp 的语法规则。
include 指令为简化jsp 程序设计复杂性提供了一种良好的机制。对于复杂的jsp 页面,我们将之分成若干个文件(导航栏,脚注,表格等),然后分别测试,最后利用include 指令将它们包含到主 jsp 文件中即可。
下面给出一个Demo:
mian.jsp代码:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<div id="mainbody">
this is the mainbody
<%@ include file="footer.jsp" %>
</body>
</html>
footer.jsp 代码如下:
<div class="footer">
CopyRight@ 2013 Design by [email protected]
可以相应导航栏和其他不变的元素。
输出如下:
指令标题 include 是在编译前将文件包含进去的,不过在jsp 里还有一个类似的但又不一样的行为标签 jsp:include,在接受请求时包含其他文件。
<jsp:include> 元素用于在 jsp 页面中包含静态或动态文件资源。但这两种包含文件的结果是不同的――如果被包含文件是静态文件,那么这种包含仅仅把被包含文件内容嵌入到<jsp:include> 元素所在的jsp 页面,如果包含的文件是动态文件,那么这个被包含的文件也会被jsp 编译器执行,执行结果被加入到<jsp:inclue>元素所在的 jsp页面。
语法格式如下:
<jsp:include page="url-spec">
Demo:
newItem.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Here is a summary of our four most recent news stories:
<ol>
<li><jsp:include page="item1.jsp" />
<li><jsp:include page="item2.jsp" />
<li><jsp:include page="item3.jsp" />
<li><jsp:include page="item4.jsp" />
</ol>
</body>
</html>
item1.jsp,item2.jsp等代码如下:
//item1.jsp 代码
Bill Gates acts humble. In a startling and unexpected
development, Microsoft big wig Bill Gates put on an open act of
humility yesterday.
<a href="#">more details...
//item2.jsp
Scott McNealy acts serious. In an unexpected twist,
wisecracking Sun head Scott McNealy was sober and subdued at
yesterday's meeting.
<a href="#">more details...
//item3.jsp
Larry Ellison acts conciliatory. Catching his competitors
off guard yesterday, Oracle prez Larry Ellison referred to his
rivals in friendly and respectful terms.
<a href="#">more details...
//item4.jsp
Sportscaster uses "literally" correctly. In an apparent
slip of the tongue, a popular television commentator was
heard to use the word "literally" when he did not
mean "figuratively."
<a href="#">more details...
输出如下:
因为applet 已经不怎么使用了,所以如果你对此不感兴趣的,可以到此直接结束阅读。
在 jsp 页面嵌入applet,要用到行为标签 jsp:plugin.<jsp:plugin>元素用于在浏览器播放或显示一个对象,如applet或 bean。当 jsp文件被编译并将结果返回到浏览器时,<jsp:plugin>会根据浏览器的版本替换成<object>(用于html4.0),如果没有java 插件,还需指定从哪里下载这个java 插件。
语法格式如下:
<jsp:plugin options>: .. 可以选择填写以下属性(加粗的属性是必须包含的):
type = bean or applet 标识组件类型是 bean 还是 applet
code = classname of plugin object 插件对象名 类名.class
codebase = location of class object 类的文件目录
name,align, archive, height,width,hspace, vspace,iepluginurl,nspluginurl, jrevision
其他属性解释如下:
name="instanceName" 这个Bean或applet实例的名字,它将会在Jsp其它的地方调用.
align = “bottom|top|left|rigeht|middle”――用html语法
archive = “url to archive” 一些由逗号分开的路径名,这些路径名用于预装一些将要使用的class,这会提高applet的性能.
height="displayPixels" ;displayPixels" Applet或Bean将要显示的长宽的值,此值为数字,单位为象素.
hspace="leftRightPixels" vspace="topBottomPixels" Applet或Bean显示时在屏幕左右,上下所需留下的空间,单位为象素.
iepluginurl="URLToPlugin" IE用户能够使用的JRE的下载地址,此值为一个标准的URL
nspluginurl="URLToPlugin" Netscape Navigator用户能够使用的JRE的下载地址,此值为一个标准的URL,
jreversion="JREVersionNumber | 1.1" Applet或Bean运行所需的Java Runtime Environment (JRE) 的版本. 缺省值是 1.1.
另外可能还会用到的两个行为标签有:
<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ] </jsp:params>
用来指定 applet 或 bean 运行所需要的参数。
<jsp:fallback> text message for user </jsp:fallback> </jsp:fallback>
如果插件能启动,则显示该标签指定的内容。如:
<jsp:plugin type="applet" code="MyApplet.class">
<jsp:fallback>
Error: this example requires Java.
</jsp:fallback>
</jsp:plugin>
Demo:显示带有背影的文本.
shadowedText.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:plugin type="applet" code="ShadowedTextApplet.class"
codebase="com.tools" style="color: #006080">"475" height="350">
<jsp:params>
<jsp:param name="message" value="Your message here" />
</jsp:params>
<jsp:fallback>
this example requires java
</jsp:fallback>
</jsp:plugin>
</body>
</html>
ShadowedTestApplet.java
package com.tools;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
publicclass ShadowedTextApplet extends JApplet implements ActionListener {
private JTextField messageField;
private JComboBox<String> fontBox;
private JSlider fontSizeSlider;
private JButton showFrameButton;
publicvoid init() {
Color bgColor = new Color(0xFD, 0xF5, 0xE6);
Font font = new Font("Serif", Font.PLAIN, 16);
Container contentPane = getContentPane();
contentPane.setLayout(new GridLayout(4, 1));
contentPane.setbgColor);< /pre>
//用 JTextField 获取初始文本
messageField = new JTextField(20);
String message = getParameter("message");
if (message != null) {
messageField.setText(message);
}
JPanel messagePanel = new LabelPanel("Message:", "Message to Display", bgColor, font, messageField);
contentPane.add(messagePanel);
//使用复选框选择字体
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontNames = env.getAvailableFontFamilyNames();
fontBox = new JComboBox<>(fontNames);
fontBox.setEditable(false);
JPanel fontPanel = new LabelPanel("Font:", "Font to Use", bgColor, font, fontBox);
contentPane.add(fontPanel);
// 使用 JSlider选择文字大小
fontSizeSlider = new JSlider(0, 150);
fontSizeSlider.setbgColor);< /pre>
fontSizeSlider.setMajorTickSpacing(50);
fontSizeSlider.setMinorTickSpacing(25);
fontSizeSlider.setPaintTicks(true);
fontSizeSlider.setPaintLabels(true);
JPanel fontSizePanel = new LabelPanel("Font Size:", "Font Size to Use", bgColor, font, fontSizeSlider);
contentPane.add(fontSizePanel);
//点击按钮便可打开阴影文字
showFrameButton = new JButton("Open Frame");
showFrameButton.addActionListener(this);
JPanel buttonPanel = new LabelPanel("Show Shadowed Text:", "Open JFrame to Show Shadowed Text", bgColor, font,
showFrameButton);
contentPane.add(buttonPanel);
}
publicvoid actionPerformed(ActionEvent event) {
String message = messageField.getText();
if (message.length() == 0) {
message = "No Message";
}
String fontName = (String) fontBox.getSelectedItem();
int fontSize = fontSizeSlider.getValue();
JFrame frame = new ShadowedTextFrame(message, fontName, fontSize);
frame.pack();
frame.setVisible(true);
}
}
LabelPanle.jave
package com.tools;
import java.awt.Color;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
publicclass LabelPanel extends JPanel {
public LabelPanel(String labelMessage, String title, Color bgColor, Font font, JComponent component) {
setbgColor);< /pre>
setFont(font);
setBorder(BorderFactory.createTitledBorder(title));
JLabel label = new JLabel(labelMessage);
label.setFont(font);
add(label);
component.setFont(font);
add(component);
}
}
ShadowedTextFrame.java
package com.tools;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.TextLayout;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
publicclass ShadowedTextFrame extends JFrame {
privateint width = 400;
privateint height = 300;
private TextLayout textLayout;
public ShadowedTextFrame(String message, String fontName, int fontSize) {
initUI();
BufferedImage image = createImage(message,fontName,fontSize);
add(new JLabel(new ImageIcon(image)));
}
private BufferedImage createImage(String message, String fontName, int fontSize) {
int x = 10;
int y = 100;
Font font = new Font(fontName, Font.ITALIC, 50);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g1 = image.createGraphics();
setRenderingHints(g1);
textLayout = new TextLayout(message, font, g1.getFontRenderContext());
g1.setPaint(Color.WHITE);
g1.fillRect(0, 0, width, height);
g1.setPaint(new Color(150, 150, 150));
textLayout.draw(g1, x + 3, y + 3);
g1.dispose();
float[] kernel = { 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f, 1f / 9f };
ConvolveOp op = new ConvolveOp(new Kernel(3, 3, kernel), ConvolveOp.EDGE_NO_OP, null);
BufferedImage image2 = op.filter(image, null);
Graphics2D g2 = image2.createGraphics();
setRenderingHints(g2);
g2.setPaint(Color.BLACK);
textLayout.draw(g2, x, y);
return image2;
}
privatevoid initUI() {
setTitle("Shadowed Text");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(width, height);
setLocationRelativeTo(null);
}
privatevoid setRenderingHints(Graphics2D g) {
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
}
}
因为需要在浏览器安装插件,在这里只能给出大致的运行效果如下: