Java要運(yùn)行html代碼,需要運(yùn)行在服務(wù)器端,也就是servlet容器中,經(jīng)過(guò)容器編譯解析,返回html靜態(tài)內(nèi)容,示例如下:
站在用戶的角度思考問題,與客戶深入溝通,找到白朗網(wǎng)站設(shè)計(jì)與白朗網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋白朗地區(qū)。
在servlet里面寫就可以了
引入一系列包
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
public class Servlet1 extends HttpServlet {
public void doGet(ServletRequest req,ServletResponse res)throws ServletException, IOException{try{PrintWriter pw=res.getWriter();//在瀏覽器輸出需要
pw.println("scriptscript");}catch(exception e){="" e.printstacktrace();="" 為發(fā)現(xiàn)調(diào)試錯(cuò)誤}}}=""
Web容器啟動(dòng)后執(zhí)行代碼的幾種方式
其執(zhí)行順序?yàn)椋?/p>
4===5===1===2===3
即指定init-method的Bean開始執(zhí)行
接著實(shí)現(xiàn)spring的Bean后置處理器開始執(zhí)行
然后是Servlet的監(jiān)聽器執(zhí)行
再接下來(lái)是Servlet的過(guò)濾器執(zhí)行
最后才是Servlet執(zhí)行
1、實(shí)現(xiàn)Servlet監(jiān)聽器接口ServletContextListener
[java] view plain copy
public class InitListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent context) {
}
@Override
public void contextInitialized(ServletContextEvent context) {
// 上下文初始化執(zhí)行
System.out.println("================[ServletContextListener]自動(dòng)加載啟動(dòng)開始.");
SpringUtil.getInstance().setContext(
span style="white-space:pre" /spanWebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext())
span style="white-space:pre" /span);
}
}
然后在web.xml文件配置該監(jiān)聽器
[html] view plain copy
listener
listener-classcom.test.init.InitListener/listener-class
/listener
2、實(shí)現(xiàn)Servlet的過(guò)濾器Filter
[html] view plain copy
public class InitFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException,
ServletException {
}
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("================[Filter]自動(dòng)加載啟動(dòng)開始.");
// 讀取Spring容器中的Bean[此時(shí)Bean已加載,可以使用]
//寫啟動(dòng)需要執(zhí)行的代碼
System.out.println("================[Filter]自動(dòng)加載啟動(dòng)結(jié)束.");
}
}
然后在web.xml文件配置過(guò)濾器即可
[html] view plain copy
filter
filter-nameInitFilter/filter-name
filter-classcom.test.init.InitFilter/filter-class
/filter
filter-mapping
filter-nameInitFilter/filter-name
url-pattern//url-pattern
/filter-mapping
3、編寫一個(gè)Servlet,在web.xml里面配置容器啟動(dòng)后執(zhí)行即可
[html] view plain copy
public class InitServlet extends HttpServlet {
/**
*/
private static final long serialVersionUID = 1L;
@Override
public void init(ServletConfig config) {
try {
super.init();
} catch (ServletException e) {
e.printStackTrace();
}
System.out.println("================[Servlet]自動(dòng)加載啟動(dòng)開始.");
// 讀取Spring容器中的Bean[此時(shí)Bean已加載,可以使用]
//執(zhí)行想要的代碼
System.out.println("================[Servlet]自動(dòng)加載啟動(dòng)結(jié)束.");
}
}
然后在web.xml文件配置該Servlet的啟動(dòng)方式為:容器啟動(dòng)后執(zhí)行
servlet
servlet-nameInitServlet/servlet-name
servlet-classcom.test.init.InitServlet/servlet-class
init-param
param-nameusername/param-name
param-valuetest/param-value
/init-param
!-- 此處指定加載順序?yàn)?,表明還有優(yōu)先級(jí)更高的Servlet要先執(zhí)行 --
load-on-startup2/load-on-startup
/servlet
servlet-mapping
servlet-nameInitServlet/servlet-name
url-pattern//url-pattern
/servlet-mapping
關(guān)于啟動(dòng)后執(zhí)行,由load-on-startup指定:
(1)當(dāng)值為0或者大于0時(shí),表示容器在應(yīng)用啟動(dòng)時(shí)就加載這個(gè)servlet。值越小,啟動(dòng)優(yōu)先級(jí)越高;
(2)當(dāng)是一個(gè)負(fù)數(shù)時(shí)或者沒有指定時(shí),表示該servlet被調(diào)用時(shí)才加載。
4、如果你使用Spring IOC作為Bean管理容器,那么可以指定init-method其中init-method表示bean加載成功后,立即執(zhí)行某個(gè)方法。配置如下:start為要執(zhí)行的方法名稱
[html] view plain copy
!-- service --
bean id="shopService" class="com.test.teach.service.ShopService" span style="color:#33ffff;"init-method="start"/span
property name="shopDao" ref="shopDao" /
/bean
網(wǎng)頁(yè)地址在代碼中的java代碼寫法如下:
package com.test;
import java.lang.reflect.Method;
//實(shí)現(xiàn)打開瀏覽器并跳到指定網(wǎng)址的類
public class BareBonesBrowserLaunch {
public static void openURL(String url) {
try {
browse(url);
} catch (Exception e) {
}
}
private static void browse(String url) throws Exception {
//獲取操作系統(tǒng)的名字
String osName = System.getProperty("os.name", "");
if (osName.startsWith("Mac OS")) {
//蘋果的打開方式
Class fileMgr = Class.forName("com.apple.eio.FileManager");
Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[] { String.class });
openURL.invoke(null, new Object[] { url });
} else if (osName.startsWith("Windows")) {
//windows的打開方式。
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
} else {
// Unix or Linux的打開方式
String[] browsers = { "firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape" };
String browser = null;
for (int count = 0; count browsers.length browser == null; count++)
//執(zhí)行代碼,在brower有值后跳出,
//這里是如果進(jìn)程創(chuàng)建成功了,==0是表示正常結(jié)束。
if (Runtime.getRuntime().exec(new String[] { "which", browsers[count] }).waitFor() == 0)
browser = browsers[count];
if (browser == null)
throw new Exception("Could not find web browser");
else
//這個(gè)值在上面已經(jīng)成功的得到了一個(gè)進(jìn)程。
Runtime.getRuntime().exec(new String[] { browser, url });
}
}
}
//主方法 測(cè)試類
public static void main(String[] args) {
String url = ""; ? ? ?
BareBonesBrowserLaunch.openURL(url);
}
要在java中執(zhí)行js代碼,首先明白,java不支持瀏覽器本身的方法。支持自定義的js方法,否則會(huì)報(bào)錯(cuò)
先新建一個(gè)js文件:jsss.js
內(nèi)容如下:
function aa(a,b){ ? ?return a+b;
}
然后在java中寫代碼:
public class ZipTest {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
String jsFileName="G:\\javaPro\\zmwmcc\\WebRoot\\jsss.js";
FileReader reader = new FileReader(jsFileName); ? // 執(zhí)行指定腳本 ? ?? ? ? ? ?engine.eval(reader);
if(engine instanceof Invocable) {
Invocable invoke = (Invocable)engine; ? ?// 調(diào)用merge方法,并傳入兩個(gè)參數(shù)
Double c = (Double)invoke.invokeFunction("aa", 2, 3); //調(diào)用了js的aa方法
System.out.println(c);
}
// engine.eval("alert(\"js alert\");"); ? ?// 不能調(diào)用瀏覽器中定義的js函數(shù) // 錯(cuò)誤,會(huì)拋出alert引用不 ? ?}
}
1. RequestDispatcher.forward()
是在服務(wù)器端起作用,當(dāng)使用forward()時(shí),Servlet engine傳遞HTTP請(qǐng)求從當(dāng)前的Servlet or JSP到另外一個(gè)Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此時(shí)form提交的所有信息在 b.jsp都可以獲得,參數(shù)自動(dòng)傳遞. 但forward()無(wú)法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同時(shí)forward()無(wú)法在后面帶參數(shù)傳遞,比如servlet?name=frank,這樣不行,可以程序內(nèi)通過(guò)response.setAttribute("name",name)來(lái)傳至下一個(gè)頁(yè)面。
重定向后瀏覽器地址欄URL不變。
例:在servlet中進(jìn)行重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html; charset=gb2312");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp"); //定向的頁(yè)面
rd.forward(request, response);
}
通常在servlet中使用,不在jsp中使用。
2. response.sendRedirect()
是在用戶的瀏覽器端工作,sendRedirect()可以帶參數(shù)傳遞,比如servlet?name=frank傳至下個(gè)頁(yè)面,同時(shí)它可以重定向至不同的主機(jī)上,sendRedirect()可以重定向有frame.的jsp文件.
重定向后在瀏覽器地址欄上會(huì)出現(xiàn)重定向頁(yè)面的URL
例:在servlet中重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html; charset=gb2312");
response.sendRedirect("/index.jsp");
}
由于response是jsp頁(yè)面中的隱含對(duì)象,故在jsp頁(yè)面中可以用response.sendRedirect()直接實(shí)現(xiàn)重定位。
注意:
(1) 使用response.sendRedirect時(shí),前面不能有HTML輸出;
這并不是絕對(duì)的,不能有HTML輸出其實(shí)是指不能有HTML被送到了瀏覽器。事實(shí)上現(xiàn)在的server都有cache機(jī)制,一般在8K(我是說(shuō) JSP SERVER),這就意味著,除非你關(guān)閉了cache,或者你使用了out.flush()強(qiáng)制刷新,那么在使用sendRedirect之前,有少量的HTML輸出也是允許的。
(2) response.sendRedirect之后,應(yīng)該緊跟一句return。
我們已經(jīng)知道response.sendRedirect是通過(guò)瀏覽器來(lái)做轉(zhuǎn)向的,所以只有在頁(yè)面處理完成后,才會(huì)有實(shí)際的動(dòng)作。既然你已經(jīng)要做轉(zhuǎn)向了,那么后的輸出還有什么意義呢?而且有可能會(huì)因?yàn)楹竺娴妮敵鰧?dǎo)致轉(zhuǎn)向失敗。
比較:
(1) Dispatcher.forward()是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址;
(2) response.sendRedirect()則是完全的跳轉(zhuǎn),瀏覽器將會(huì)得到跳轉(zhuǎn)的地址,并重新發(fā)送請(qǐng)求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。
前者更加高效,在前者可以滿足需要時(shí),盡量使用RequestDispatcher.forward()方法。
注:在有些情況下,比如,需要跳轉(zhuǎn)到一個(gè)其它服務(wù)器上的資源,則必須使用HttpServletResponse.sendRequest()方法。
3. <jsp:forward page="" />
它的底層部分是由RequestDispatcher來(lái)實(shí)現(xiàn)的,因此它帶有RequestDispatcher.forward()方法的印記。
如果在之前有很多輸出,前面的輸出已使緩沖區(qū)滿,將自動(dòng)輸出到客戶端,那么該語(yǔ)句將不起作用,這一點(diǎn)應(yīng)該特別注意。
另外要注意:它不能改變?yōu)g覽器地址,刷新的話會(huì)導(dǎo)致重復(fù)提交
4. 修改HTTP header的Location屬性來(lái)重定向
通過(guò)設(shè)置直接修改地址欄來(lái)實(shí)現(xiàn)頁(yè)面的重定向。
jsp文件代碼如下:
<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn = "/newpath/jsa.jsp";
response.setHeader("Location",newLocn);
%>
5. JSP中實(shí)現(xiàn)在某頁(yè)面停留若干秒后,自動(dòng)重定向到另一頁(yè)面
在html文件中,下面的代碼:
<meta http-equiv="refresh" content="300; url=target.jsp">
它的含義:在5分鐘之后正在瀏覽的頁(yè)面將會(huì)自動(dòng)變?yōu)閠arget.html這一頁(yè)。代碼中300為刷新的延遲時(shí)間,以秒為單位。targer.html為你想轉(zhuǎn)向的目標(biāo)頁(yè),若為本頁(yè)則為自動(dòng)刷新本頁(yè)。
由上可知,可以通過(guò)setHeader來(lái)實(shí)現(xiàn)某頁(yè)面停留若干秒后,自動(dòng)重定向到另一頁(yè)面。
關(guān)鍵代碼:
String content=stayTime+";URL="+URL;
response.setHeader("REFRESH",content);
/**
* 打開打印窗口
* url:鏈接頁(yè)面或action動(dòng)作
* Banglu
*/
function printWindow(url){
var sURL = url;
var sFeatures = "toolbar=no, menubar=no, scrollbars=no,resizable=yes, "
+ "location=no, status=no, titlebar=no, width=800, height=600, top=100, left=100";
window.open(sURL,'notoolbar',sFeatures);
}function exportWindow(url){
var sURL = url;
var sFeatures = "toolbar=no, menubar=no, scrollbars=no,resizable=yes, "
+ "location=no, status=no, titlebar=no, width=800, height=600, top=50, left=50";
var objwin=window.open(sURL,'export'+randomNum(),sFeatures);
objwin.close();
}
/**
* 打開模態(tài)窗口
* url:鏈接頁(yè)面或action動(dòng)作
* width:打開模態(tài)窗口的寬度
* height:打開模態(tài)窗口的高度
* 注意:打開模態(tài)窗口的頁(yè)面中要在head后面加上
* meta http-equiv="Pragma" content="no-cache":禁止模態(tài)窗口緩存
* base target="_self"/:模態(tài)窗口中的表單在本窗口中提交
* a onClick='window.location = "view-source:" + window.location.href'b源文件/b/a 可以查看模態(tài)窗口的源文件
* Banglu
*/
function modalWindow(url, width, height){
var sURL = url;
var sFeatures = "dialogWidth:" + width + "px; dialogHeight:" + height + "px; "
+ "help:no; scroll:yes; center:yes; status:no;resizable:yes";
window.showModalDialog(sURL, window, sFeatures);
}/**
* 打開普通窗口
* url:鏈接頁(yè)面或action動(dòng)作
* width:寬度
* height:高度
* Banglu
*/
function openWindow(url, width, height){
var sURL=url;
var sFeatures = "scrollbars=yes, status=yes, resizable=yes,"
+ "toolbar=yes, menubar=yes, location=yes, titlebar=yes"
if(width!=null){
sFeatures+=", width="+width;
}
if(height!=null){
sFeatures+=", height="+height;
}
window.open(sURL, 'open'+randomNum(), sFeatures);
}/**
* 打開窗口
* url:鏈接頁(yè)面或action動(dòng)作
* width:寬度
* height:高度
Banglu
*/
function openNoBarWindow(url, width, height){
var sURL=url;
var sFeatures = "scrollbars=no, status=no, resizable=no,"
+ "toolbar=no, menubar=no, location=no, titlebar=no"
if(width!=null){
sFeatures+=", width="+width;
sFeatures+=", left="+(screen.width-width)/2;
}
if(height!=null){
sFeatures+=", height="+height;
sFeatures+=", top="+(screen.height-height-100)/2;
}
window.open(sURL, 'openNoBar'+randomNum(), sFeatures);
}
/**
* 打開全屏窗口
* url:鏈接頁(yè)面或action動(dòng)作
* Banglu
*/
function openFullWindow(url){
var sURL=url;
var sFeatures = "toolbar=no, menubar=no, scrollbars=no, resizable=yes, "
+ "location=no, status=no, titlebar=no, width="+(screen.width-10)+", "
+ "height="+(screen.height-60)+", top=0, left=0";
window.open(sURL, 'full'+randomNum(), sFeatures);
}/**
* 打開主窗口
* url:鏈接頁(yè)面或action動(dòng)作
* Banglu
*/
function openMainWindow(url){
var sURL=url;
var sFeatures = "toolbar=no, menubar=no, scrollbars=no, resizable=yes, "
+ "location=no, status=no,titlebar=no, width="+(screen.width-10)+", "
+ "height="+(screen.height-60)+", top=0, left=0";
window.open(sURL, 'main', sFeatures);
}
/**
* 設(shè)置鏈接
* url:連接的jsp頁(yè)面或action動(dòng)作
* Banglu
*/
function link(url, frameID){
if(frameID==null){
window.location.href = url;
}
else{
window.frames[frameID].location = url
}
}/**
* 回車代替tab
* Banglu
*/
function handleKey(){
var gk = window.event.keyCode;
if (gk==13) {
if(window.event.srcElement.tagName!='TEXTAREA'){
window.event.keyCode=9;
return;
}
}
}/**
* 全屏顯示
* Banglu
*/
function fullScreen(){
window.dialogHeight=window.screen.availHeight;
window.dialogWidth=window.screen.availWidth;
}
function Resize_dialog(t,l,w,h) {
window.dialogTop = t+"px";
window.dialogLeft = l+"px";
window.dialogHeight = h+"px";
window.dialogWidth = w+"px";
}