轉(zhuǎn)發(fā)和重定向的區(qū)別
成都創(chuàng)新互聯(lián)專注于來(lái)鳳網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供來(lái)鳳營(yíng)銷型網(wǎng)站建設(shè),來(lái)鳳網(wǎng)站制作、來(lái)鳳網(wǎng)頁(yè)設(shè)計(jì)、來(lái)鳳網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造來(lái)鳳網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供來(lái)鳳網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
重定向response.sendRedirect("success.jsp");
轉(zhuǎn)發(fā):request.getRequestDispatcher("success.jsp").forward(request,response);
1.轉(zhuǎn)發(fā)在服務(wù)器端完成的;重定向是在客戶端完成的
★2.轉(zhuǎn)發(fā)的速度快;重定向速度慢
3.轉(zhuǎn)發(fā)的是同一次請(qǐng)求;重定向是兩次不同請(qǐng)求
★4.轉(zhuǎn)發(fā)不會(huì)執(zhí)行轉(zhuǎn)發(fā)后的代碼;重定向會(huì)執(zhí)行重定向之后的代碼
★5.轉(zhuǎn)發(fā)地址欄沒(méi)有變化;重定向地址欄有變化
6.轉(zhuǎn)發(fā)必須是在同一臺(tái)服務(wù)器下完成;重定向可以在不同的服務(wù)器下完成
其實(shí)做站點(diǎn)開(kāi)發(fā)的很少使用java的,像Apache等可以直接配置301跳轉(zhuǎn),可是tomcat只是一個(gè)servlet容器,沒(méi)辦法我只能使用過(guò)濾器來(lái)實(shí)現(xiàn)301跳轉(zhuǎn),下面把代碼分享給大家。
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class URLFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
final HttpServletResponse res=(HttpServletResponse)response;
String requestPage = req.getRequestURI();
String queryString = (req.getQueryString() == null ? "" : "?"+req.getQueryString());
if(req.getRequestURL().indexOf("") =0){
res.setStatus(301);
res.setHeader( "Location", ""+requestPage+queryString);
res.setHeader( "Connection", "close" );
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
問(wèn)題重復(fù)了?重定向前把PrintStream out = System.out;恢復(fù)的時(shí)候,在setOut(out);不要說(shuō)不行,已經(jīng)測(cè)試過(guò)了。
實(shí)現(xiàn)輸出從控制臺(tái)到GUI并不復(fù)雜 只需要將標(biāo)準(zhǔn)輸出重定向
重定向標(biāo)準(zhǔn)輸出很easy System 類里有兩個(gè)靜態(tài)方法setErr(PrintStream err) 和 setOut(PrintStream out) 分別用于重定位 標(biāo)準(zhǔn) 錯(cuò)誤輸出流和 標(biāo)準(zhǔn) 輸出流 只需要在程序初始時(shí)設(shè)置即可
// GUIPrintStream guiPrintStream = new GUIPrintStream(System out jTextArea);
System setErr(guiPrintStream);
System setOut(guiPrintStream);
在上面的代碼中 我們發(fā)現(xiàn)一個(gè)新的類 GUIPrintStream 這是我們?yōu)?PrintStream 所做的包裝 因?yàn)槲覀兊妮敵瞿繕?biāo)位置是GUI 所以需要在 PrintStream 上做些文章 大家請(qǐng)看下面 GUIPrintStream 的代碼
Java代碼
/**//*
* To change this template choose Tools | Templates
* and open the template in the editor
*/
import java io OutputStream;
import java io PrintStream;
import javax swing SwingUtilities;
import javax swing text JTextComponent;
/** *//**
* 輸出到文本組件的流
*
* @author Chen Wei
* @website chenwei mobi
* @email chenw
*/
public class GUIPrintStream extends PrintStream {
private JTextComponent ponent;
private StringBuffer *** = new StringBuffer();
public GUIPrintStream(OutputStream out JTextComponent ponent) {
super(out);
ponent = ponent;
}
/** *//**
* 重寫(xiě)write()方法 將輸出信息填充到GUI組件
* @param buf
* @param off
* @param len
*/
@Override
public void write(byte[] buf int off int len) {
final String message = new String(buf off len);
SwingUtilities invokeLater(new Runnable() {
public void run() {
*** append(message);
ponent setText( *** toString());
}
});
}
}
/**//*
* To change this template choose Tools | Templates
* and open the template in the editor
*/
import java io OutputStream;
import java io PrintStream;
import javax swing SwingUtilities;
import javax swing text JTextComponent;
/** *//**
* 輸出到文本組件的流
*
* @author Chen Wei
* @website chenwei mobi
* @email chenw
*/
public class GUIPrintStream extends PrintStream {
private JTextComponent ponent;
private StringBuffer *** = new StringBuffer();
public GUIPrintStream(OutputStream out JTextComponent ponent) {
super(out);
ponent = ponent;
}
/** *//**
* 重寫(xiě)write()方法 將輸出信息填充到GUI組件
* @param buf
* @param off
* @param len
*/
@Override
public void write(byte[] buf int off int len) {
final String message = new String(buf off len);
SwingUtilities invokeLater(new Runnable() {
public void run() {
*** append(message);
ponent setText( *** toString());
}
});
}
}
類 GUIPrintStream 繼承自 PrintStream 并且對(duì)它進(jìn)行了一些修改
GUIPrintStream 在構(gòu)造函數(shù)中增加了一個(gè) JTextComponent 變量 它就是我們的目標(biāo)輸出 GUI 組件 它規(guī)定了目標(biāo)輸出組件是一個(gè)文本組件 接下來(lái)覆寫(xiě)了 write(byte[] buf int off int len)方法 這個(gè)方法原來(lái)的作用是將 len 字節(jié)從指定的初始偏移量為 off 的 byte 數(shù)組寫(xiě)入此流 現(xiàn)在經(jīng)過(guò)我們的修改 變成了將 byte 數(shù)組包裝成 String 寫(xiě)入目標(biāo) GUI 組件
簡(jiǎn)單的代碼完成了將標(biāo)準(zhǔn)輸出重定向到 GUI 的全過(guò)程 由此延伸 還可以將標(biāo)準(zhǔn)輸出重定向到文本文件 從GUI獲取標(biāo)準(zhǔn)輸入等 就不一一介紹
測(cè)試
Java代碼
public class MainFrame extends javax swing JFrame {
public MainFrame() {
initComponents();
// 重定向到通過(guò)文本組件構(gòu)建的組件輸出流中
System setOut(new GUIPrintStream(System out textArea));
}
private void initComponents() {
scrollPane = new javax swing JScrollPane();
textArea = new javax swing JTextArea();
btnOut = new javax swing JButton();
setDefaultCloseOperation(javax swing WindowConstants EXIT_ON_CLOSE);
setTitle( 標(biāo)準(zhǔn)輸出重定向到GUI chenwei mobi );
textArea setColumns( );
textArea setRows( );
scrollPane setViewportView(textArea);
getContentPane() add(scrollPane java awt BorderLayout CENTER);
btnOut setText( System out println(System getProperties()); );
btnOut addActionListener(new java awt event ActionListener() {
public void actionPerformed(java awt event ActionEvent evt) {
btnOutActionPerformed(evt);
}
});
getContentPane() add(btnOut java awt BorderLayout PAGE_END);
pack();
}
private void btnOutActionPerformed(java awt event ActionEvent evt) {
System out println(System getProperties());
}
/**
* @param args the mand line arguments
*/
public static void main(String args[]) {
java awt EventQueue invokeLater(new Runnable() {
public void run() {
new MainFrame() setVisible(true);
}
});
}
private javax swing JButton btnOut;
private javax swing JScrollPane scrollPane;
private javax swing JTextArea textArea;
lishixinzhi/Article/program/Java/hx/201311/25870