WebWork標簽非常出色,在有些應用中,可能不想使用其環境,但希望能夠使用其標簽思路。JSP模板的使用面更廣,隨簡化WebWork方式,提供思路供大家參考。
1、開發標簽基礎類:
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.Writer;
import java.util.Iterator;
import java.util.LinkedList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public abstract class AbstractTag extends BodyTagSupport {
protected String templateName ;
private final static String templatePath = "/WEB-INF/tags/";
private static final long serialVersionUID = -1201668454354226175L;
public String getTemplateName() {
return templateName;
}
public void setTemplateName(String templateName) {
this.templateName = templateName;
}
protected String getBody() {
if (bodyContent == null) {
return "";
} else {
return bodyContent.getString().trim();
}
}
protected abstract void prepareData ();
public int doEndTag() throws JspException {
try {
prepareData ();
include(templatePath + this.getTemplateName(), pageContext.getOut(),
pageContext.getRequest(),
(HttpServletResponse)
pageContext.getResponse());
} catch (Exception e) {
// e.printStackTrace();
throw new JspException(e);
}
return EVAL_BODY_INCLUDE;
}
public int doStartTag() throws JspException {
try {
pageContext.getOut().write(getBody());
} catch (IOException e) {
throw new RuntimeException("IOError: " + e.getMessage(), e);
}
return EVAL_PAGE;
}
public static void include(String aResult, Writer writer,ServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String resourcePath = aResult;
RequestDispatcher rd = request.getRequestDispatcher(resourcePath);
if (rd == null) {
throw new ServletException("Not a valid resource path:"
+ resourcePath);
}
// Include the resource
PageResponse pageResponse = new PageResponse(response);
// Include the resource
rd.include((HttpServletRequest) request, pageResponse);
// write the response back to the JspWriter, using the correct encoding.
String encoding = "GB2312";
if (encoding != null) {
// use the encoding specified in the property file
pageResponse.getContent().writeTo(writer, encoding);
} else {
// use the platform specific encoding
pageResponse.getContent().writeTo(writer, null);
}
}
static final class PageResponse extends HttpServletResponseWrapper {
protected PrintWriter pagePrintWriter;
protected ServletOutputStream outputStream;
private PageOutputStream pageOutputStream = null;
/**
* Create PageResponse wrapped around an existing HttpServletResponse.
*/
public PageResponse(HttpServletResponse response) {
super(response);
}
/**
* Return the content buffered inside the {@link PageOutputStream}.
*
* @return
* @throws IOException
*/
public FastByteArrayOutputStream getContent() throws IOException {
// if we are using a writer, we need to flush the
// data to the underlying outputstream.
// most containers do this - but it seems Jetty 4.0.5 doesn't
if (pagePrintWriter != null) {
pagePrintWriter.flush();
}
return ((PageOutputStream) getOutputStream()).getBuffer();
}
/**
* Return instance of {@link PageOutputStream} allowing all data written
* to stream to be stored in temporary buffer.
*/
public ServletOutputStream getOutputStream() throws IOException {
if (pageOutputStream == null) {
pageOutputStream = new PageOutputStream();
}
return pageOutputStream;
}
/**
* Return PrintWriter wrapper around PageOutputStream.
*/
public PrintWriter getWriter() throws IOException {
if (pagePrintWriter == null) {
pagePrintWriter = new PrintWriter(new
OutputStreamWriter(
getOutputStream(), getCharacterEncoding()));
}
return pagePrintWriter;
}
}
static final class PageOutputStream extends ServletOutputStream {
private FastByteArrayOutputStream buffer;
public PageOutputStream() {
buffer = new FastByteArrayOutputStream();
}
/**
* Return all data that has been written to this OutputStream.
*/
public FastByteArrayOutputStream getBuffer() throws IOException {
flush();
return buffer;
}
public void close() throws IOException {
buffer.close();
}
public void flush() throws IOException {
buffer.flush();
}
public void write(byte[] b, int o, int l) throws IOException {
buffer.write(b, o, l);
}
public void write(int i) throws IOException {
buffer.write(i);
}
public void write(byte[] b) throws IOException {
buffer.write(b);
}
}
static public class FastByteArrayOutputStream extends OutputStream {
// Static --------------------------------------------------------
private static final int DEFAULT_BLOCK_SIZE = 8192;
private LinkedList buffers;
// Attributes ----------------------------------------------------
// internal buffer
private byte[] buffer;
// is the stream closed?
private boolean closed;
private int blockSize;
private int index;
private int size;
// Constructors --------------------------------------------------
public FastByteArrayOutputStream() {
this(DEFAULT_BLOCK_SIZE);
}
public FastByteArrayOutputStream(int aSize) {
blockSize = aSize;
buffer = new byte[blockSize];
}
public int getSize() {
return size + index;
}
public void close() {
closed = true;
}
public byte[] toByteArray() {
byte[] data = new byte[getSize()];
// Check if we have a list of buffers
int pos = 0;
if (buffers != null) {
Iterator iter = buffers.iterator();
while (iter.hasNext()) {
byte[] bytes = (byte[]) iter.next();
System.arraycopy(bytes, 0, data, pos, blockSize);
pos += blockSize;
}
}
// write the internal buffer directly
System.arraycopy(buffer, 0, data, pos, index);
return data;
}
public String toString() {
return new String(toByteArray());
}
// OutputStream overrides ----------------------------------------
public void write(int datum) throws IOException {
if (closed) {
throw new IOException("Stream closed");
} else {
if (index == blockSize) {
addBuffer();
}
// store the byte
buffer[index++] = (byte) datum;
}
}
public void write(byte[] data, int offset, int length) throws IOException {
if (data == null) {
throw new NullPointerException();
} else if
((offset < 0) || ((offset + length) > data.length) || (length
< 0)) {
throw new IndexOutOfBoundsException();
} else if (closed) {
throw new IOException("Stream closed");
} else {
if ((index + length) > blockSize) {
int copyLength;
do {
if (index == blockSize) {
addBuffer();
}
copyLength = blockSize - index;
if (length < copyLength) {
copyLength = length;
}
System.arraycopy(data, offset, buffer, index, copyLength);
offset += copyLength;
index += copyLength;
length -= copyLength;
} while (length > 0);
} else {
// Copy in the subarray
System.arraycopy(data, offset, buffer, index, length);
index += length;
}
}
}
// Public
public void writeTo(OutputStream out) throws IOException {
// Check if we have a list of buffers
if (buffers != null) {
Iterator iter = buffers.iterator();
while (iter.hasNext()) {
byte[] bytes = (byte[]) iter.next();
out.write(bytes, 0, blockSize);
}
}
// write the internal buffer directly
out.write(buffer, 0, index);
}
public void writeTo(RandomAccessFile out) throws IOException {
// Check if we have a list of buffers
if (buffers != null) {
Iterator iter = buffers.iterator();
while (iter.hasNext()) {
byte[] bytes = (byte[]) iter.next();
out.write(bytes, 0, blockSize);
}
}
// write the internal buffer directly
out.write(buffer, 0, index);
}
public void writeTo(Writer out, String encoding) throws IOException {
// Check if we have a list of buffers
if (buffers != null) {
Iterator iter = buffers.iterator();
while (iter.hasNext()) {
byte[] bytes = (byte[]) iter.next();
if (encoding != null) {
out.write(new String(bytes, encoding));
} else {
out.write(new String(bytes));
}
}
}
// write the internal buffer directly
if (encoding != null) {
out.write(new String(buffer, 0, index, encoding));
} else {
out.write(new String(buffer, 0, index));
}
}
/**
* Create a new buffer and store the
* current one in linked list
*/
protected void addBuffer() {
if (buffers == null) {
buffers = new LinkedList();
}
buffers.addLast(buffer);
buffer = new byte[blockSize];
size += index;
index = 0;
}
}
}
2、定義一個具體的標簽類
public class ListTag extends RiseAbstractTag {
private static final long serialVersionUID = 3385568988234498913L;
protected String templateName = "list.jsp";
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
protected void prepareData() {
this.setTemplateName(this.templateName);
pageContext.getRequest().setAttribute("id", this.id);
}
}
3、定義TLD文件
參考TLD文檔
4、定義list.jsp模板
<%@ page contentType="text/html; charset=GBK" %>
<%
String id = (String)request.getAttribute("id");
%>
<table width="90%" border="0" cellpadding="0" cellspacing="2">
<tr>
<td>Id</td>
<td align="right"><%= id %></td>
</tr>
</table>
5、使用默認模板
<WWTag:list id="Hello World!"/>
6、使用自定義模板
a: 定義模板
<%@ page contentType="text/html; charset=GBK" %>
<%
String id = (String)request.getAttribute("id");
out.println("Id is : " + id);
%>
b: use it , 模板名:testList.jsp,放在/WEB-INF/tags目錄下
<WWTag:list id="Hello World!" templateName="testList.jsp"/>
團隊在外地封閉開發,沒有帶交換機功能能的HUB來連接到ADSL。只好共享ADSL方式。
1、windows下共享非常簡單,把ADSL共享即可,但不要把每一個連接都撥號給選上,否則無法使用。此時局域網內IP地址在192.168.0.1--192.168.0.2XX之間。問題是:容易壞,不穩定。隨改用Linux。
2、Linux環境下使用。Red Hat Linux ES3版本。(文檔來自網絡收集,共享大家使用)
http://www.chinalinuxpub.com/read.php?wid=558
1、 網卡配置。
我這里用的網卡是RTL8029和3com905。在系統中,RTL8029標記為eth0,3com905標記為eth1。RTL8029和3com905的IP地址分別是192.168.0.1、192.168.1.1(其他的地址也可),掩碼均為255.255.255.0。
eth0用于連接網通,eth1用于連接內網,局域網網段為192.168.0.0。
注意:此處兩塊網卡均不能設網關。
2、 PPPoE軟件的升級與安裝
1) 在 http://www.roaringpenguin.com/pppoe/#download
下載
2) 安裝rp-pppoe。以root身份執行
rpm –Uvh
rp-pppoe-3.5-1.i386.rpm
3、 修改/etc/ sysctl.conf
將其中的
net.ipv4.ip_forward
= 0
改為
net.ipv4.ip_forward
= 1
4、 去除ipchains模塊,只選擇iptables方法如下:
1)setup
2)選擇system service
3)去除ipchains
4)選中iptables
5)重啟機器
5、 PPPoE客戶端配置
在rp-pppoe-3.5-1.i386.rpm安裝完畢后,接下來就可進行PPPoE客戶端配置了。過程如下。
#/usr/sbin/adsl-setup
>>>
Enter your PPPoE user name: ——此處輸入撥號帳號的用戶名
>>>
Enter the Ethernet interface connected to the ADSL modem For Solaris, this is
likely to be something like /dev/hme0. For Linux, it will be ethn, where 'n'
is a number. (default eth0): ——輸eth0
>>>
Enter the demand value (default no): ——輸no
>>>
Enter the DNS information here: ——輸210.83.130.18
>>>
Please enter your PPPoE password: ——輸網通用戶口令
>>>
Choose a type of firewall (0-2): ——輸0
>>>
Accept these settings and adjust configuration files (y/n)? ——輸y
6、 啟動撥號連接
/usr/sbin/adsl-start
成功連接后,屏幕顯示Connected。
此時這臺linux已可以上網瀏覽了。
7、 IP偽裝
為了使局域網中的其他機器能通過Linux服務器共享上網,至少須執行下面的命令:
iptables
-t nat -A POSTROUTING -o ppp0 -j MASQUERADE
完成后,在192.168.0.0網段(網關為192.168.0.1)的PC機就可透過Linux上網了!
8、 開機自啟動
為了使Linux服務器能夠自動撥號,執行下面步驟。
1)chkconfig --add adsl
2)setup
3)選擇system services
4)選中ADSL
5)OK退出
6)打開/etc/rc.d/rc.local,在該文件的末尾添上下面語句
echo
"[OK]"
echo
"Drop ICMP form anywhere"
echo
1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo
"[OK]"
iptables
-t nat -A POSTROUTING -o ppp0 -j MASQUERADE
說明:前面四句用于關閉ICMP,防止別人Ping。
9、 至此,一切OK,一個簡單的撥號建成了。重啟機器后,發現linux的internet共享連接已經一切就緒了,好妙!!!
為了建立更安全的撥號連接,請再設置各種安全機制吧,好事多磨嘛。
另外,如果網關后面的客戶機無法通過linux上網,請留意一下linux的防火墻設置。
|
REDHAT9上ADSL最終解決方案
發布于2005-05-29 被讀559次
【字體:大 中 小】
在LINUXSIR和LINUXFANS上看了很多關于ADSL的文章,都沒有解決我的REDHAT9上ADSL上網的問題,今天實在是沒有辦法,重新建立連接,曲折的經歷,終于上網了(非常激動,可能表達的不是很好),特的寫下我的過程,作為參考:
REDHAT默認的PPPOE有問題,需要RPM -E,然后,安裝這個 --實際在RedES3上沒必要按照這個共享包。
http://www.roaringpenguin.com/pppoe/rp-pppoe-3.5.tar.gz(北南兄推薦)
解壓和安裝:
#tar zxvf rp-pppoe-3.5.tar.gz
進入解壓目錄執行
#sh ./go
然后再來設置ADSL。這一處,我們要用命令。
#adsl-setup
Welcome to the Roaring Penguin ADSL client
setup. First, I will run
some checks on your system to make sure the
PPPoE client is installed
properly...
Looks good! Now, please enter some
information:
USER NAME
>>> Enter your PPPoE user name
(default XXX): 在這里輸入ADSL的用戶名
INTERFACE
>>> Enter the Ethernet interface
connected to the ADSL modem
For Solaris, this is likely to be something
like /dev/hme0.
For Linux, it will be ethn, where 'n' is a
number.
(default eth0):如果一張網卡就設置寫上eth0
Do you want the link to come up on demand,
or stay up continuously?
If you want it to come up on demand, enter
the idle time in seconds
after which the link should be dropped. If
you want the link to
stay up permanently, enter 'no' (two
letters, lower-case.)
NOTE: Demand-activated links do not
interact well with dynamic IP
addresses. You may have some problems with
demand-activated links.
>>> Enter the demand value
(default no):不用寫什么
DNS
Please enter the IP address of your ISP's
primary DNS server.
If your ISP claims that 'the server will
provide DNS addresses',
enter 'server' (all lower-case) here.
If you just press enter, I will assume you
know what you are
doing and not modify your DNS setup.
>>> Enter the DNS information
here:在這里寫上202.96.134.133
下一個DNS是202.96.168.68 //這里根據個人不同可以修改
PASSWORD
>>> Please enter your PPPoE
password:輸入密碼
>>> Please re-enter your PPPoE
password:再輸入一次
FIREWALLING
Please choose the firewall rules to use.
Note that these rules are
very basic. You are strongly encouraged to
use a more sophisticated
firewall setup; however, these will provide
basic security. If you
are running any servers on your machine,
you must choose 'NONE' and
set up firewalling yourself. Otherwise, the
firewall rules will deny
access to all standard servers like Web,
e-mail, ftp, etc. If you
are using SSH, the rules will block
outgoing SSH connections which
allocate a privileged source port.
The firewall choices are:
0 - NONE: This script will not set any
firewall rules. You are responsible
for ensuring the security of your machine.
You are STRONGLY
recommended to use some kind of firewall
rules.
1 - STANDALONE: Appropriate for a basic
stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine
acting as an Internet gateway
for a LAN
>>> Choose a type of firewall
(0-2):這里添寫為2
** Summary of what you entered **
Ethernet Interface: eth0
User name: XXX
Activate-on-demand: No
DNS: Do not adjust
Firewalling: MASQUERADE
>>> Accept these settings and
adjust configuration files (y/n)?
弄完后,就按一個y鍵。
(以上為北南兄文章里面內容)
不要急于連接,REBOOT -N
然后進入網絡設置,停止ETH1(我的是用他)
然后ADSL-START
PING 你的DNS,如果可以,那么,恭喜你!
其中部分內容可能不同,僅作參考,主要在連接后,能夠PING通DNS即可!
==========================================================================
首先應該確定您是否安裝了pppoe的應用程序。
如果確實已經安裝了,可以在終端用 adsl-setup命令啟動adsl配置,提示過程為英文。
大概為:
[root@localhost root]# adsl-setup
Welcome to the ADSL client setup. First, I
will run some checks on
your system to make sure the PPPoE client
is installed properly...
The following DSL config was found on your
system:
Device: Name:
ppp0 DSLppp0
Please enter the device if you want to
configure the present DSL config
(default ppp0) or enter 'n' if you want to
create a new one: ppp0 //默認為ppp0
LOGIN NAME
Enter your Login Name (default SJ00411210A1): anthrax //這里用你自己的用戶名代替我的anthrax:)
INTERFACE
Enter the Ethernet interface connected to
the ADSL modem
For Solaris, this is likely to be something
like /dev/hme0.
For Linux, it will be ethX, where 'X' is a
number.
(default eth0): eth0 //默認網卡設備為eth0
Do you want the link to come up on demand,
or stay up continuously?
If you want it to come up on demand, enter
the idle time in seconds
after which the link should be dropped. If
you want the link to
stay up permanently, enter 'no' (two
letters, lower-case.)
NOTE: Demand-activated links do not
interact well with dynamic IP
addresses. You may have some problems with
demand-activated links.
Enter the demand value (default no): no //這里使用默認no就可以了,斷線后不自動撥號。
DNS
Please enter the IP address of your ISP's
primary DNS server.
If your ISP claims that 'the server will provide
dynamic DNS addresses',
enter 'server' (all lower-case) here.
If you just press enter, I will assume you
know what you are
doing and not modify your DNS setup.
Enter the DNS information here:
202.96.134.133 //主DNS地址設置,根據您的具體情況替換。
Please enter the IP address of your ISP's
secondary DNS server.
If you just press enter, I will assume
there is only one DNS server.
Enter the secondary DNS server address
here: 202.96.134.133 //第二DNS地址設置。
PASSWORD
Please enter your Password: //這里設置密碼,和unix規則一樣,密碼并不回顯,因此不要認為您的鍵盤出了毛病:)
Please re-enter your Password:
//確認密碼
USERCTRL
Please enter 'yes' (two letters,
lower-case.) if you want to allow
normal user to start or stop DSL connection
(default yes): yes //是否允許普通用戶共享ADSL。
FIREWALLING
Please choose the firewall rules to use.
Note that these rules are
very basic. You are strongly encouraged to
use a more sophisticated
firewall setup; however, these will provide
basic security. If you
are running any servers on your machine,
you must choose 'NONE' and
set up firewalling yourself. Otherwise, the
firewall rules will deny
access to all standard servers like Web,
e-mail, ftp, etc. If you
are using SSH, the rules will block
outgoing SSH connections which
allocate a privileged source port.
The firewall choices are:
0 - NONE: This script will not set any
firewall rules. You are responsible
for ensuring the security of your machine.
You are STRONGLY
recommended to use some kind of firewall
rules.
1 - STANDALONE: Appropriate for a basic
stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine
acting as an Internet gateway
for a LAN
Choose a type of firewall (0-2): 1 //配置防火墻等級,根據您的需要選擇。
Start this connection at boot time
Do you want to start this connection at
boot time?
Please enter no or yes (default no):no //是否允許開機自動加載,這里選擇no,否則系統啟動速度太慢!
** Summary of what you entered **
Ethernet Interface: eth0
User name: anthrax
Activate-on-demand: No
Primary DNS: 202.96.134.133
Secondary DNS: 202.96.134.133
Firewalling: STANDALONE
User Control: yes
Accept these settings and adjust
configuration files (y/n)?
選擇y,配置完成。您可以用 adsl-start命令啟動,可以用adsl-stop命令停止。
為了方便,可以在桌面建立一個應用程序鏈接,命令就使用adsl-start。這樣每次雙擊那個快捷圖標就可以建立adsl鏈接了,跟windows中一樣方便。
好了,現在就開始您的網絡之旅吧。(技巧:如果依據本內容操作扔不能鏈接網絡,可以嘗試在"系統設置->網路"中刪除當前的網卡,重新配置adsl項。)