2006年6月16日
1.index.html
<iframe id="mainIframe" scrolling="no" frameborder="0" width="100%" src="a.html"></iframe>
<a href="#" onclick="page('a.html')">a頁面</a><a href="#" onclick="page('b.html')">b頁面</a>
2 a.html //內嵌頁面
<script language="javascript">
changeHight();
</script>
3. b.html //內嵌頁面
<script language="javascript">
changeHight();
</script>
4. page.js
function changeHight(){
var iFrm = parent.document.getElementById("mainIframe");
var subWeb = iFrm.contentDocument;
if(subWeb){
if (subWeb.body.scrollHeight>480)
iFrm.height = subWeb.body.scrollHeight+20;
else
iFrm.height=500;
}
if(top.document.frames["mainIframe"].document && window.document.body.scrollHeight!="0"){
parent.document.getElementById("mainIframe").style.height=window.document.body.scrollHeight;
}
if(top.document.frames["mainIframe"].document && window.document.body.scrollHeight=="0"){
parent.document.getElementById("mainIframe").style.height=500;
}
}
function page(page){
document.getElementById("mainIframe").src=page;
}
造成IE,FireFox,Opera中Iframe顯示差異原因在于
1.iframe在FireFox中取法為parent.document.getElementById("mainIframe").contentDocument,而在ie,opera中為parent.document.getElementById("mainIframe").document
2.當頁面無滾動時,window.document.body.scrollHeight在IE中能取到,fireFox和Opera中取不到。
摘要: 1.myapp/index.html
<html>
<head>
文件操作
<iframe id="iframefile" scrolling="no" frameborder="0" width="100%" src="/myapp/fileUpload.jsp"></iframe>
&l...
閱讀全文
一些頻繁使用的javascript頁面控制,做個總結。
下面是部分代碼。
<html>
<head>
<script language="javascript">
function a(){
window.document.getElementsByName("dx")[0].checked=true;
}
function b(){
window.document.getElementsByName("dx")[0].checked=false;
}
function c(){
window.document.getElementsByName("fx")[0].checked=true;
}
function d(){
window.document.getElementsByName("fx")[0].checked=false;
}
function e(){
for(i=0;i<window.document.getElementsByName("fx").length;i++){
if(!window.document.getElementsByName("fx")[i].checked){
window.document.getElementsByName("fx")[i].checked=true;
}
}
}
function f(){
for(i=0;i<window.document.getElementsByName("fx").length;i++){
if(window.document.getElementsByName("fx")[i].checked){
window.document.getElementsByName("fx")[i].checked=false;
}
}
}
function g(){
window.document.getElementById("lbka")[1].selected=true;
}
function h(){
alert("選擇號為:"+window.document.getElementById("lbka").selectedIndex + " 值為:" +window.document.getElementById("lbka")[window.document.getElementById("lbka").selectedIndex].value+" 文本值為:" + window.document.getElementById("lbka")[window.document.getElementById("lbka").selectedIndex].text);
}
function m(){
sel = false;
var val="";
for(i=0;i<window.document.getElementsByName("dx").length;i++){
if(window.document.getElementsByName("dx")[i].checked){
val = window.document.getElementsByName("dx")[i].value;
sel=true;
break;
}
}
if(sel){
alert("單選值為:"+val);
}else{
alert("請選擇文件");
return false;
}
}
function j(){
var sel = false;
var val="";
for(i=0;i<window.document.getElementsByName("fx").length;i++){
if(window.document.getElementsByName("fx")[i].checked){
if(val==""){
val=window.document.getElementsByName("fx")[i].value;
}else{
val = val + "," +window.document.getElementsByName("fx")[i].value;
}
}
}
if(val==""){
alert("請選擇文件");
return false;
}else{
alert("復選值為:"+val);
}
}
</script>
</head>
<body>
<table id="table1" width="100%" border="1" align="center" cellpadding="0" cellspacing="0">
<tr>
<td>文件</td>
<td>列表框</td>
<td>單選</td>
<td>復選</td>
</tr>
<tr>
<td>文件A</td>
<td><select name="lbka"><option value="lbka1">文件A1</option><option value="lbka2">文件A2</option></select></td>
<td><input type="radio" name="dx" value="dxa"></td>
<td><input type="checkbox" name="fx" value="fxa"></td>
</tr>
<tr>
<td>文件B</td>
<td><select name="lbkb"><option value="lbkb1">文件B1</option><option value="lbkb2">文件B2</option></select></td>
<td><input type="radio" name="dx" value="dxb"></td>
<td><input type="checkbox" name="fx" value="fxb"></td>
</tr>
<tr>
<td colspan="4">
<a href="#" onclick="a();">單選A選中</a>
<a href="#" onclick="b();">單選A不選中</a>
<a href="#" onclick="c();">復選A選中</a>
<a href="#" onclick="d();">復選A不選中</a>
<a href="#" onclick="e();">復選全選</a>
<a href="#" onclick="f();">復選全不選</a>
<a href="#" onclick="g();">選中列表框文件A2</a>
<a href="#" onclick="h();">取得選中列表框A的值,文本</a>
<a href="#" onclick="m();">判斷單選選擇</a>
<a href="#" onclick="j();">判斷復選選擇</a>
</td>
</tr>
</table>
</body>
</html>
主要通過javascript實現,理解IE的DOM結構,并調用元素的固定方法,可以實現表單元素的動態增刪。
下面是部分代碼。
<html>
<head>
<script language="javascript">
function add(){
//取得表格
var table = document.getElementById("table1");
//取得行數;
var num = table.rows.length;
//增加一行
var newrow1 = table.insertRow(num-1);
var cell1 = newrow1.insertCell();
var cell2 = newrow1.insertCell();
var cell3 = newrow1.insertCell();
var cell4 = newrow1.insertCell();
//增加行元素
var inputcell2 = document.createElement("<input size='32' name=''>");
cell2.appendChild(inputcell2);
var inputcell4_1 = document.createElement("<input size='32' name=''>");
var inputcell4_2 = document.createElement("<input type='button' value='刪除元素'onClick='del(this);'/>");
cell4.appendChild(inputcell4_1);
cell4.appendChild(inputcell4_2);
//刷新標簽顯示
frash();
}
function del(obj){
//取得按鈕所在行
var i = obj.parentNode.parentNode.rowIndex;
var tab = document.getElementById("table1");
//刪除按鈕所在行
tab.deleteRow(i-1);
frash();
}
function frash(){
var table = document.getElementById("table1");
var num = table.rows.length;
//計算動態元素個數
var n = num-2;
for(i=1;i<=n;i++){
//設置標簽值
table.rows[i].cells[0].innerText="元素"+i+"屬性A";
//設置屬性值
table.rows[i].cells[1].childNodes[0].setAttribute("name","ysa"+i);
table.rows[i].cells[2].innerText="元素"+i+"屬性B";
table.rows[i].cells[3].childNodes[0].setAttribute("name","ysb"+i);
}
}
</script>
</head>
<body>
<table id="table1" width="100%" border="1" align="center" cellpadding="0" cellspacing="0">
<tr>
<td>標簽1</td>
<td><input name="a"></td>
<td>標簽2</td>
<td><input name="b"></td>
</tr>
<tr>
<td colspan="4" align="center"><a href="#" onclick="add();">增加元素</a></td>
</tr>
</table>
</body>
</html>
頁面打印通常直接調用IE中打印命令,并通過class控制打印范圍。當頁面文件內容過多,無法完整打印時,可以通過javascript控制縮放實現完整打印。
下面是部分代碼。
<
html>
<head>
<title>***上海市眼病防治中心病人結帳費用報表***</title>
<meta http-equiv="Content-Type" content="text/
html; charset=gb2312">
<!--media=print 這個屬性可以在打印時有效-->
<style media=print>
.Noprint{display:none;}
.PageNext{page-break-after: always;}
</style>
<style>
body,td,th
{
font-size: 12px;
}
.tdp
{
border-bottom: 1 solid #000000;
border-left: 1 solid #000000;
border-right: 0 solid #ffffff;
border-top: 0 solid #ffffff;
}
.tabp
{
border-color: #000000;
border-collapse:collapse;
}
.NOPRINT {
font-family: "宋體";
font-size: 12px;
}
</style>
<script language="javascript">
var i=0;
function zoomL(){
i++;
document.getElementById("f").style.zoom=1+i/3;
}
function zoomS(){
i--;
document.getElementById("f").style.zoom=1+i/3;
}
</script>
</head>
<body >
<OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0 V
IEWASTEXT> </OBJECT>
<input type=button value=打印 onclick="document.all.WebBrowser.ExecWB(6,1)" class="NOPRINT">
<input type=button value=直接打印 onclick="document.all.WebBrowser.ExecWB(6,6)" class="NOPRINT">
<input type=button value=頁面設置 onclick="document.all.WebBrowser.ExecWB(8,1)" class="NOPRINT">
<input type=button value=打印預覽 onclick="document.all.WebBrowser.ExecWB(7,1)" class="NOPRINT">
<input type=button value=放大 onclick="zoomL();" class="NOPRINT">
<input type=button value=縮小 onclick="zoomS();" class="NOPRINT">
<br/>
<table width="90%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr align="center">
<td colspan="5"><font size="3">上海市眼病防治中心病人結帳費用報表(A) </font></td>
</tr>
<tr>
<td>匯總人次 5</td>
<td>費用合計 15853.12</td>
<td>統計日期 </td>
<td>制表人 023</td>
<td>制表日期:2004-05-13</td>
</tr>
</table>
<table width="90%" border="1" align="center" cellpadding="2" cellspacing="0" bordercolor="#000000" class="tabp" id="f">
<tr>
<td >姓名</td>
<td >住院號</td>
<td >科室</td>
<td >結帳日期</td>
<td >出院日期</td>
<td >費用合計</td>
<td >醫保交易費用</td>
<td >分類給付費用</td>
<td >非醫保交易費</td>
</tr>
<tr>
<td > </td>
<td > </td>
<td > </td>
<td > </td>
<td > </td>
<td > </td>
<td > </td>
<td > </td>
<td > </td>
</tr>
</table>
<hr align="center" width="90%" size="1" n
oshade class="NOPRINT" >
<!--分頁-->
<div class="PageNext"></div>
<table width="90%" border="1" align="center" cellpadding="2" cellspacing="0" bordercolor="#000000" class="tabp">
<tr>
<td >第2頁</td>
</tr>
<tr>
<td >看到分頁了吧</td>
</tr>
<tr>
<td > </td>
</tr>
<tr>
<td > </td>
</tr>
<tr>
<td ><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" >這樣的報表
對一般的要求就夠了。</td>
<td> </td>
</tr>
</table></td>
</tr>
</table>
<table width="780%" border="1" class="Noprint">
<tr>
<td>能不能打印</td>
</tr>
</table>
</body>
</
html>
思路是把表單類型設置為enctype="multipart/form-data",其他表單中文本數據通過javascript處理,附加在action后面,后臺通過request.getParameter()取得。上傳文件調用commons-fileupload.jar中方法。
下面是部分代碼。
<form name="ajform" action="/da.do" method="post" enctype="multipart/form-data">
<tr><td><input name="a" value=""></td></tr>
<tr><td><input name="b" type="file"></td></tr>
<tr><td><a href="#" onclick="checksubmit();">提交</a></td></tr>
</form>
<script language="javascript">
function checksubmit(){
var value = "/da.do?formAction=save";
value = value+"&a="+ window.document.getElementById("a").value;
window.document.ajform.action=value;
window.document.ajform.submit();
}
</script>
String a = request.getParameter("a");
try {
//文件上傳目錄“/file/wj”
String filepath= request.getSession().getServletContext().getRealPath("/")+"file"+File.separator+"wj";
//文件上傳臨時目錄“/file/temp”
String tempPath = request.getSession().getServletContext().getRealPath("/")+"file"+File.separator+"temp";
File dir = new File(filepath);
//建立目錄
if(!dir.exists()){
dir.mkdirs();
}
File dir1 = new File(tempPath);
if(!dir1.exists()){
dir1.mkdirs();
}
DiskFileUpload fu = new DiskFileUpload();
//設置最大文件尺寸,這里是10MB
fu.setSizeMax(10485760);
//設置緩沖區大小,這里是4kb
fu.setSizeThreshold(4096);
//設置臨時目錄:
fu.setRepositoryPath(tempPath);
List fileItems = fu.parseRequest(request);
Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
String fileName = item.getName();
//判斷是否為文件
if(fileName!=null){
//取文件名
String name = fileName.substring(fileName.lastIndexOf(File.separator)+1);
if(fileName!=null&& !fileName.equals("")) {
File file = new File(filepath+File.separator+name);
//上傳文件
item.write(file);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
<html>
<head>
</head>
<body>
<embed height=240 name=aa style="BORDER-BOTTOM:#2a8a21 3px solid;BORDER-LEFT:#2a8a21 3px ?solid;BORDER-RIGHT:#2a8a21 3px solid;BORDER-TOP:#2a8a21 3px solid"
?type=audio/x-pn-realaudio-plugin width=320 loop="no" console="clip1" reset="false"
?controls="ImageWindow" src="a1.rmvb">
</embed><br>
<embed height=30 type=audio/x-pn-realaudio-plugin width=320? console="clip1"? reset="false" autostart="false" controls="controlpanel">
</embed><br>
<embed height=30 type=audio/x-pn-realaudio-plugin width=320? console="clip1"? reset="false" autostart="false" controls="statusbar">
</embed><br>
<Script Language=JavaScript>
function OpenFile(txt){
?document.aa.src=txt.value;
}
</Script>
</body>
</html>
1。EJB打包
<?xml version="1.0"?>
<project name="jartest" default="jar" basedir=".">
<property name="build.dir" value="${basedir}/build" />
<property name="build.classes.dir" value="${build.dir}/classes" />
<target name="jar" description="打包成Jar">
<jar jarfile="${basedir}/ejbfile.jar">
<fileset dir="${build.classes.dir}">
<include name="**/*.class" />
</fileset>
<metainf dir="${basedir}/META-INF ">
<include name="**" />
</metainf>
</jar>
</target>
</project>
2。web應用打包
<?xml version="1.0"?>
<project name="wartest" default="war" basedir=".">
<target name="war" description="創建WEB發布包">
<war warfile="${basedir}/EJBTest.war" webxml="${basedir}/WEB-INF/web.xml">
<fileset dir="${basedir}">
<include name="**"/>
<exclude name="build.xml" />
<exclude name="/WEB-INF/web.xml" />
</fileset>
</war>
</target>
</project>
1.web.xml中配置Spring的servlet和servlet-mapping
???<servlet>
??????? <servlet-name>example</servlet-name>
??????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
????????<init-param>?
????????????<param-name>contextConfigLocation</param-name>?
????????????<param-value>/WEB-INF/application-servlet.xml</param-value>?
????????</init-param>?
????????<load-on-startup>1</load-on-startup>
??? </servlet>
??? <servlet-mapping>
??????? <servlet-name>example</servlet-name>
??????? <url-pattern>*.do</url-pattern>
??? </servlet-mapping>
2.配置spring配置文件application-servlet.xml
???<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
?????<property name="prefix">
?????????<value>/page/</value>
?????</property>
?????<property name="suffix">
?????????<value>.jsp</value>
?????</property>
???</bean>
???<bean id="urlMapping"?class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
????????<property name="mappings">
????????????<props>
????????????????<prop key="/login.do">loginAction</prop>
????????????</props>
????????</property>
???</bean>
???<bean id="loginAction" class="loginAction">
????????<property name="commandClass">
????????????<value>?LoginActionVo??</value>
????????</property>
????????<property name="formView">
????????????<value>login</value>
????????</property>
????????<property name="sessionForm">
????????????<value>true</value>
????????</property>
????????<property name="serviceLocator">
????????????<ref bean="servicelocator" />
????????</property>
?</bean>
3.新建類繼承SimpleFormController﹐並複寫protected Object formBackingObject(HttpServletRequest request)?和?protected ModelAndView onSubmit(HttpServletRequest request,?HttpServletResponse response,
?Object cmd, BindException ex)。常用結構為
???protected Object formBackingObject(HttpServletRequest request){
??????LoginActionVo??loginActionVo?? = new LoginActionVo?();
??????request.setAttribute("?loginActionVo",?loginActionVo);
??????return loginActionVo;
???}
???protected ModelAndView onSubmit(HttpServletRequest request,?HttpServletResponse response,
???????Object cmd, BindException ex){
??????LoginActionVo??loginActionVo =(LoginActionVo)cmd;
??????Map map = new HashMap();
?????map.put("?loginActionVo",?loginActionVo);
?????request.getSession().setAttribute(this.getFormSessionAttributeName(),?loginActionVo);
?????return new ModelAndView("login",map);
? }
4.將jsp頁面參數和VO進行綁定。綁定的方法為頁面元素name和VO對象對應﹐當進行深層次的綁定時﹐要注意﹐在變量的get方法中進行初始化。在servlet2.4容器中可以不用c:out標籤
輸入框綁定﹕<input name="user.name"? value = "<c:out value="${loginActionVo.user.name}"/>" type="text" disabled="disabled"? size="14" maxlength="14" /></td>
VO為﹕
?public class loginActionVo{
????private User user;
????public?User getUser(User user){
??????if( user == null){
?????????user = new User();
??????}
??????return user;
???}
?}
???
以SimpleFormController為例
1。spring 接收一個請求後首先會判斷"get"還是"post"方法
2。1 "get"方法時
?????????2。1。1 首先創建一個command對象﹐通過調用AbstractFormController的formBackingObject方法得到﹐通常是一個pojo﹐根據name用來和提交的數據綁定。
????????? 2。1。2 然後會創建一個BindException對象﹐裡面包括command對象﹐和其他一些屬性。
???????????2。1。3 判斷sessionForm 屬性﹐默認為false。如果為true﹐就會把command對象對象保存在session裡???? 面。session中key為類名+".FORM." + command對象名。可以通過request.getSession().getAttribute(this.getFormSessionAttributeName(request));得到command對象。
??????
???2。1。4 調用AbstractFormController的referenceData方法。這個方法默認為空﹐可以復寫來初始化頁面參數。
2。1。5 返回ModelAndView對象﹐返回formview頁面。
2 。2 “post”方法時
???2。2。1 首先得到command對象,如果SessionForm = false﹐調用formBackingObjectde創建
?????????????????????如果SessionForm = true,從request.getSession中得到原command對象﹐然後將command對象從
?????????????????????Session中刪除。
? 2。2。2? 然後會創建一個ServletRequestDataBinder對象﹐裡面包括command對象﹐和其他一些屬性。
???????????????????這個過程將調用initBinder()﹔可以複寫這個方法初始化數據。
?2。2。3 調用processFormSubmission(HttpServletRequest request, HttpServletResponse response, Object command,? BindException errors)。有錯誤時返回formview頁面﹐否則進入successview頁面。這個過程將調用onSubmit(Object command)﹐必須複寫這個方法放入業務邏輯。
?
???
1./WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
?xmlns="?xmlns:xsi="?xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
?<!--
<!DOCTYPE web-app
??? PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
??? "<web-app>
-->
?
?<!--
?<context-param>
??? ?<param-name>contextConfigLocation</param-name>
??? ?<param-value>/WEB-INF/application-servlet.xml</param-value>
? ?</context-param>
?<listener>
???? <listener-class>
?????? org.springframework.web.context.ContextLoaderListener
???? </listener-class>
? ?</listener>
? ?-->
?<servlet>
??????? <servlet-name>hello</servlet-name>
??????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>??
??<init-param>
????????? <param-name>contextConfigLocation</param-name>
????????? <param-value>/WEB-INF/application-servlet.xml</param-value>
???? ?</init-param>
??<load-on-startup>1</load-on-startup>
??? </servlet>
?
??? <servlet-mapping>
??????? <servlet-name>hello</servlet-name>
??????? <url-pattern>*.do</url-pattern>
??? </servlet-mapping>
?
<!--
?<taglib>
???? ?<taglib-uri>/spring</taglib-uri>
???? ?<taglib-location>/WEB-INF/spring.tld</taglib-location>
?</taglib>
-->?
</web-app>
2./WEB-INF/application-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "<beans>
??? <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
??????? <property name="mappings">
??????????? <props>
??????????????? <prop key="/login.do">loginAction</prop>
??????????? </props>
??????? </property>
??? </bean>
???
??? <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
??????? <property name="viewClass">
??????????? <value>org.springframework.web.servlet.view.JstlView</value>
??????? </property>
??????? <property name="prefix">
??????????? <value>/</value>
??????? </property>
??????? <property name="suffix">
??????????? <value>.jsp</value>
??????? </property>
??? </bean>
???
??? <bean id="loginAction" class="onlyfun.caterpillar.LoginAction">
??????? <property name="commandName">
??????? ?<value>command</value>
??</property>
??<property name="commandClass">
??????????? <value>onlyfun.caterpillar.LoginForm</value>
??????? </property>
??????? <property name="successView">
??????????? <value>success</value>
??????? </property>
??????? <property name="formView">
??????????? <value>form</value>
??????? </property>
???????<property name="user">??????????
????????????<ref local="user" />
??????? </property>
??? </bean>?
???
???<bean id="user" class="onlyfun.caterpillar.User">
?????<property name="username">
??????? ?<value>111</value>
?????</property>
?????<property name="password">
??????? ?<value>111</value>
?????</property>
????</bean>
</beans>
3./form.jsp
<%@taglib prefix="spring" uri=">
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>Login</title></head>
<body>
?<spring:bind path="command.*">
??????? <font color="red"><b>${status.errorMessage}</b></font><br>
??? </spring:bind>
?? ? ??請輸入使用者名稱與密碼:<p>?? ?
??? <form name="loginform" action="login.do" method="post">
???? <spring:bind path="command.username">??
???????? ?名稱 <input type="text" name="${status.expression}" value="${status.value}"/>
???????? ?<font color="red">${status.errorMessage}</font><br>
???? </spring:bind>
???? <spring:bind path="command.password">?
???????? ?密碼 <input type="password" name="${status.expression}" value="${status.value}"/>
???????? ?<font color="red">${status.errorMessage}</font><br>
???? </spring:bind>
??????? <input type="submit" value="確定"/>
??? </form>
? ??? 注意:輸入錯誤會再回到這個頁面中。 ?
</body>
</html>
4./index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>
? </head>
? <body>??
??? begin......
??? <%
???? response.sendRedirect("login.do");
??? %>
? </body>
</html>
5./success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri=">
<html>
<head><title>Login Success</title></head>
<body>
??? <H1><c:out value="用戶名﹕${user}"/></H1>
</body>
</html>
6./WEB-INF/classes/onlyfun/caterpillar/LoginAction.class
package onlyfun.caterpillar;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet.*;
public class LoginAction extends SimpleFormController {?
????private User user;
??? protected ModelAndView onSubmit(Object command,BindException errors) throws Exception {
?????? LoginForm form = (LoginForm) command;?
???????String username = user.getUsername();
?????? String password = user.getPassword();
?????? if(username.equals(form.getUsername()) &&
??? ???? password.equals(form.getPassword())) {
????????? return new ModelAndView(this.getSuccessView(),"user", form.getUsername());
?????? }
?????? else {
??? ??? errors.reject("loginfail", "使用者名稱或密碼錯誤");
??? ??? if(!(username.equals(form.getUsername()))){
??? ???? errors.rejectValue("username", "error", null, "使用者名稱錯誤");
??? ??? }
??? ???if(!(password.equals(form.getPassword()))){
??? ???? errors.rejectValue("password", "error", null, "密碼錯誤");
??? ??? }?? ???
?????????? return new ModelAndView(this.getFormView(),errors.getModel());
?????? }
??? }
????public User getUser() {
?????return user;
????}
????public void setUser(User user) {
?????this.user = user;
????}
}
7./WEB-INF/classes/onlyfun/caterpillar/LoginForm.class
package onlyfun.caterpillar;
public class LoginForm {
??? private String username;
??? private String password;
???
??? public void setUsername(String username) {
?????? this.username = username;
??? }
???
??? public void setPassword(String password) {
?????? this.password = password;
??? }
???
??? public String getUsername() {
?????? return username;
??? }
???
??? public String getPassword() {
?????? return password;
??? }
}
8./WEB-INF/tags/spring.tld
9./WEB-INF/tags/c.tld
10./WEB-INF/classes/onlyfun/caterpillar/User.class
package onlyfun.caterpillar;
public class User {
?private String username;
?private String password;
?public String getPassword() {
??return password;
?}
?public void setPassword(String password) {
??this.password = password;
?}
?public String getUsername() {
??return username;
?}
?public void setUsername(String username) {
??this.username = username;
?}
}
?HttpServletRequest,HttpServletResponse:這兩個屬性的作用范圍最小。
????時間上:只是本身請求和應答完成就失效,當然轉發是把當前的request對象取出來傳給另一
??????????個資源,其實本身的request對象還是只生存到本次請求結束,response也同樣。
????空間上:只能發送請求的客戶端有效。
????HttpSession:一次連結到客戶端關閉,時間作用范圍比上面兩個大,空間任用范圍相同。
????ServletConfig:從一個servlet被實例化后,對任何客戶端在任何時候訪問有效,但僅對本servlet
????有效,一個servlet的ServletConfig對象不能被另一個servlet訪問。
????ServletContext:對任何servlet,任何人在任何時間都有效,這才是真正全局的對象。
????那么,ServletConfig參數和ServletContext參數到底應該如何使用,如何取得?
????一般來說,對整個應用的配置,為了不使用“硬編碼”,應該配置為ServletContext參數,比如字
????符集設定。
????<web-app>
????????.................
????????<init-param>
????????????<param-name>charset</param-name>?
????????????<param-value>GB2312</param-value>?
????????</init-param>
????????.................
????</web-app>
????注意以上格式只是2。0以后的標準格式,舊容器(引擎)采用服務商自己的格式配置。注意它的
????父元素應該是<web-app>也就是說它是對一個應用作用的。
????而如果只有一個特定的servlet要設定的參數,其它servlet不能共享,應該配置為ServletConfig
????參數,如一個讀取附件的servlet要用到絕對目錄,而別的servlet不會用到:
????<servlet>
????????????<servlet-name>GetAtt</servlet-name>
????????<servlet-class>mail.GetAttServlet</servlet-class>
????????<init-param>
????????????<param-name>absPath</param-name>?
????????????<param-value>/usr/mail/ax/axman/Maildir/</param-value>?
????????</init-param>
????</servlet>
????不用說,因為在<servlet>標簽中已經指定了name和class,也就是說只有mail.GetAttServlet這個
????servlet中才能取到path,而別的Servlet是不能取到的。
????那么如何訪問這兩個對象的參數呢?
????訪問ServletConfig參數:
????????首先要取得ServletConfig對象,然后調用它的getInitParameter();方法。要訪問
????ServletConfig對象,jsp中直接使用config內置對象,但因為你的JSP編譯后的servlet一般不會被
????加到web.xml中的,所以一般不會通過jsp來取對本JSP編譯后的servlet的配置參數,那么在servlet
????中要得到ServletConfig對象有兩種方法:
????在inii()方法中取到:通過init的重載方法傳遞
????.....
????public?class?Test?extends?HttpServlet?
????{
????????ServletConfig?config;
????????public?void?init(ServletConfig?config)?throws?ServletException?{
????????????this.config?=?config;
????????}
????????..................
????}
????然后在下面的方法中就可以訪問config對象。但要注意,為了確保能從構造方法中到到當前servlet的
????config對象,應該調用父類的構造方法:
????.....
????public?class?Test?extends?HttpServlet?
????{
????????ServletConfig?config;
????????public?void?init(ServletConfig?config)?throws?ServletException?{
????????????super.init(config);
????????????this.config?=?config;
????????}
????????..................
????}
????通過getServletConfig()方法直接到時,這樣做的好處是不必調手工傳遞屬性,想在任何時候都可
????以得到。
????還有第三種方法,要自己實現一些接口,這里作為一般討論就不介紹了。
????要訪問ServletContext對象,只要從現有的ServletConfig對象getServletContext()就可以了,然后
????調用它的getInitParameter()方法就可以獲取它的參數。
????按說:ServletContext對象的作用域比ServletConfig作用域大,為什么要從ServletConfig中到得
????ServletContext對象呢?我個人認為:容器保存了很多個ServletContext對象,請求時容器到底取哪一個
????給你呢?那就取其中包含ServletConfig信息的那個給你,就是說取ServletConfig對象的父級對象。就好
????象HttpSession要從requset中取得一樣,就是取那個包含當前requese對象的session對象給你,這只是我
????的個人想法,還沒有來得及看具體實現。反正就這么用吧。
JSF和Spring集成的資料比較少,原理是獲得彼此的上下文引用,以此進一步獲得各自管理的bean,這是可能的,因為兩者是web應用框架都遵循servlet規范,為二者整合提供了可能和基礎.
?
在Spring中ApplicationContext是相當重要的類,對于web應用,它還包裝了javax.servlet.ServletContext,為web應用提供了所有可以利用的數據,包括可管理bean,Faces中通過FacesContext類可以獲得所有可以利用的資源,同樣包括JSF的可管理支持bean,它們都圍繞著ServletContext提供了自己的門面,通過各自的門面在Servlet容器的世界里彼此相通.
本文介紹兩種方式,實現二者集成:
1.???????? 通過寫自己的類來完成二者的連通,實際上只是獲得彼此世界里存活的bean,對于JSF中事件處理可能需要更進一步的構思和編碼,為了這點,第二個方法介紹了一種框架.
2.???????? 使用框架完成二者集成.
?
一 ?自己動手,下面的代碼以示例為主,其它涉及的類和接口略去.
這個工具類提供在JSF世界里查找Spring管理的bean.也實現在Spring中查找JSF組件的方法.
package com.skysoft.rbac.dao;
?
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.faces.el.ValueBinding;
import javax.faces.FactoryFinder;
import javax.faces.application.Application;
import javax.faces.application.ApplicationFactory;
?
public final class SpringFacesUtil {
? public SpringFacesUtil() {
? }
? /**
?? * 從Spring中查找bean.
?? * @param beanname String
?? * @return Object
?? */
? public static Object findBean(String beanname) {
??? ServletContext context = (ServletContext) FacesContext.getCurrentInstance().
??????? getExternalContext().getContext();
??? ApplicationContext appctx = WebApplicationContextUtils.
??????? getRequiredWebApplicationContext(context);
??? return appctx.getBean(beanname);
? }
? /**
?? * 從JSF中查找bean.
?? * @param beanname String
?? * @return Object
?? */
? public static Object lookupBean(String beanname) {
??? Object obj = getValueBinding(getJsfEl(beanname)).getValue(FacesContext.
??????? getCurrentInstance());
??? return obj;
? }
?
? private static ValueBinding getValueBinding(String el) {
??? return getApplication().createValueBinding(el);
? }
?
? private static Application getApplication() {
??? ApplicationFactory appFactory = (ApplicationFactory) FactoryFinder.
??????? getFactory(FactoryFinder.APPLICATION_FACTORY);
??? //FactoryFinder.FACES_CONTEXT_FACTORY
??? //FactoryFinder.RENDER_KIT_FACTORY
??? return appFactory.getApplication();
? }
?
? private static String getJsfEl(String value) {
??? return "#{" + value + "}";
? }
}
下面定義一個由JSF管理的bean:
package com.skysoft.rbac.dao;
?
import javax.servlet.ServletContext;
?
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.skysoft.struts.jsf.util.FacesUtils;
?
public class ServiceLocatorBean
??? implements ServiceLocator {
? private static final String DAO_SERVICE_BEAN_NAME = "userDAO";
? //這個dao就是由Spring提供的管理bean,這個dao可以使用Hibernate實現.
? private UserDAO dao;
?
? public ServiceLocatorBean() {
??? this.dao = (UserDAO)SpringFacesUtil.findBean(DAO_SERVICE_BEAN_NAME);
? }
?
? public UserDAO getDao() {
??? return dao;
? }
}
下面是一個使用ServiceLocatorBean的類.
public class UserDAOImp
??? extends HibernateDaoSupport implements UserDAO {
? private UserDAO dao;
? private List list;
?
? public UserDAOImp() {}
?
? public List getList() {
??? if (list == null) {
????? list = dao.getList();
??? }
??? return list;
? }
?
? public UserDAO getDao() {
??? return dao;
? }
?
? public void setDao(UserDAO dao) {
??? this.dao = dao;
? }
}
?
在faces-config.xml中的配置:
?????? <managed-bean>
????????????? <managed-bean-name>serviceLocatorBean</managed-bean-name>
????????????? <managed-bean-class>com.skysoft.rbac.dao.ServiceLocatorBean</managed-bean-class>
????????????? <managed-bean-scope>session</managed-bean-scope>
?????? </managed-bean>
?????? <managed-bean>
????????????? <managed-bean-name>User</managed-bean-name>
????????????? <managed-bean-class>com.skysoft.rbac.User</managed-bean-class>
????????????? <managed-bean-scope>request</managed-bean-scope>
????????????? <managed-property>
???????????????????? <property-name>serviceLocator</property-name>
???????????????????? <property-class>com.skysoft.rbac.dao.ServiceLocatorBean</property-class>
???????????????????? <value>#{serviceLocatorBean}</value>
????????????? </managed-property>
?????? </managed-bean>
在applicationContext.xml中的配置:
?????? <bean id="userDAO" class="com.skysoft.rbac.dao.UserDAOImp">
????????????? <property name="sessionFactory">
???????????????????? <ref local="sessionFactory" />
????????????? </property>
?????? </bean>
二 使用框架
1 介紹
這個框架是Spring相關項目,提供一個包de.mindmatters.faces.spring,這個包包含JSF和Spring框架綜合集成的粘合代碼,這些代碼以獨立于一個實現的方式完成,這樣它能和任何JSF實現一起使用.
本包的提供的代碼主要目的是盡可能透明的集成兩個框架,主要特征:
l???????? JSF/JSP開發者應該能訪問Spring管理的Beans,就好象它們是由JSF管理的.
l???????? JSF可管理beans應能集成入Spring.
l???????? RequestHandledEvent事件也應該能被發布到Spring.
2? JSF配置集成
本包構造了一個基于faces配置文件(e.g. /WEB-INF/faces-config.xml)的WebApplicationContext類, 讓它成為遵循"spring-beans" DTD配置文件(e.g. defined in /WEB-INF/applicationContext.xml)來配置的ApplicationContext的孩子,這樣依從"faces-config" DTD的WebApplicationContext就是全特征的,即自動擁有如下功能:
l???????? JSF可管理beans實現了Spring的*Aware interfaces:
ApplicationContextAware
BeanFactoryAware
BeanNameAware
ResourceLoaderAware
ServletContextAware
l???????? JSF可管理beans實現Spring的lifecycle interfaces:
InitializingBean
DisposableBean
l???????? 實現Spring的FactoryBean interface
l???????? 實現Spring的ApplicationListener interface
l???????? 發布ApplicationEvent事件.
l???????? 從資源中讀取消息.
等等,更多可看Spring.
3 訪問方式
1) 從JSF中程序化的訪問Spring管理的beans.
因為在FacesWebApplicationContext和ApplicationContext之間有層次關系,所以你的JSF可管理支持beans能容易的實現ApplicationContextAware接口,并能通過getBean方法訪問它而不管它是否定義在FacesWebApplicationContext中還是定義在父ApplicationContext類對象中.
2) 通過JSF EL從JSF中訪問Spring管理的beans.
能夠使用JSF EL訪問beans無論你引用的bean由JSF管理還是由Spring管理.兩個bean上下文在存取時間合并.
a) 直接訪問:
如果一個帶有請求名字的bean只存在于Spring上下文內的話,這個bean被使用,bean的singleton屬性設置被完全保持.
b) 區域化訪問(scoped access):
如果你要從JSF定義bean的作用域的能力上得益還想讓那個bean由Spring管理,那么就要在兩個上下文中定義,只是對于JSF上下文中的定義的類類型要使用de.mindmatters.faces.spring.SpringBeanFactory類,你還應該設置那個bean的singleton屬性到false,因這能覆蓋你的作用域設置.在你使用JSF EL訪問bean時,你總能獲得一個遵從你在JSF上下文中定義的作用域設置的由Spring管理的bean的實例.
?
三 用法
通常,就象設置任何其它JSF web應用一樣設置你的web應用,下面的樣例配置展示怎樣使能上面提到的特征。
在web.xml
配置中必須加入下列配置條目,
同時注意把該庫的jsf-spring.jar
放在適當的位置.
<web-app>
??? .........
??? <!--
??????? 過濾器用于向Spring發布RequestHandledEvent,它應該影射到和FacesServlet url相同的模式.
??? -->???
??? <filter>
??????? <filter-name>RequestHandled</filter-name>
??????? <filter-class>de.mindmatters.faces.spring.support.RequestHandledFilter</filter-class>
??? </filter>
??????
??? <filter-mapping>
??????? <filter-name>RequestHandled</filter-name>
??????? <url-pattern>*.faces</url-pattern>
??? </filter-mapping>
?
??? <!--
??? 這個偵聽器用于裝入Spring beans的父應用上下文.
??? -->
??? <listener>
??????? <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
??? </listener>
??? .........
</web-app>
下面的一些說明,都可以通過下載這個Spring相關項目得到,列在這里只為演示上面的說明的功能.
WEB-INF/faces-config.xml
<!-- 一個純JSF管理的bean -->
<managed-bean>
??? <managed-bean-name>jsfBean</managed-bean-name>
??? <managed-bean-class>example.NameBean</managed-bean-class>
??? <managed-bean-scope>session</managed-bean-scope>
??? <managed-property>
??????? <property-name>name</property-name>
??? </managed-property>
</managed-bean>
<!--一個SpringBeanScope用來定義Spring可管理bean的作用域.-->
?????? <managed-bean>
????????????? <managed-bean-name>scopedAccessSpringBean</managed-bean-name>
?????? <managed-bean-class>de.mindmatters.faces.spring.SpringBeanScope</managed-bean-class>
????????????? <managed-bean-scope>session</managed-bean-scope>
?????? </managed-bean>
<!-- 這是一個純JSF可管理bean,它持有一個到Spring可管理bean的一個引用. -->
<managed-bean>
??? <managed-bean-name>referencingBean</managed-bean-name>
??? <managed-bean-class>example.ReferencingBean</managed-bean-class>
??? <managed-bean-scope>session</managed-bean-scope>
??? <managed-property>
??????? <property-name>referencedBean</property-name>
??????? <value>#{managedPropertyAccessSpringBean}</value>
??? </managed-property>
</managed-bean>
WEB-INF/applicationContext.xml (partial)
<!-- 一個純Spring的可管理bean -->
<bean id="directAccessSpringBean" class="example.NameBean"/>
<!-- 一個向JSF作用域提供的可管理bean.? -->
<bean id="scopedAccessSpringBean" class="example.NameBean" singleton="false"/>
<!-- 一個純Spring的可管理bean,它由一個JSF可管理bean引用.(當然了,它也能被直接訪問啦.) -->
<bean id="managedPropertyAccessSpringBean" class="example.NameBean" singleton="false"/>
參考:
1./home.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="
??? <xsl:output method="html" omit-xml-declaration="yes" />
??? <xsl:template match="/">
??????? <html>
??????????? <head><title>Hello!</title></head>
??????????? <body>
??????????????? <h1>My First Words</h1>
??????????????? <xsl:for-each select="wordList/word">
??????????????????? <xsl:value-of select="."/><br />
??????????????? </xsl:for-each>
??????????? </body>
??????? </html>
??? </xsl:template>
</xsl:stylesheet>
2./index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>???
? </head>
? <body>
? ?<center><input type="button" value="xslt" onclick="location.href='home.htm'"></center>
? </body>
</html>
3./WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
?xmlns="
?xmlns:xsi="
?xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee?
?<servlet>
??????? <servlet-name>hello</servlet-name>
??????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
??<init-param>
???????? <param-name>contextConfigLocation</param-name>
???????? <param-value>/WEB-INF/application-servlet.xml</param-value>
??? ?</init-param>?
??? </servlet> ?
??? <servlet-mapping>
??????? <servlet-name>hello</servlet-name>
??????? <url-pattern>*.htm</url-pattern>
??? </servlet-mapping> ??
</web-app>
4./WEB-INF/application-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "
<beans>
??? <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
??????? <property name="mappings">
??????????? <props>
??????????????? <prop key="/home.htm">homeAction</prop>
??????????? </props>
??????? </property>
??? </bean>??
??? <bean id="bundleViewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
??????? <property name="basename">
??????????? <value>views</value>
??????? </property>
??? </bean>??
??? <bean id="homeAction" class="xslt.HomePageController"/>
</beans>
5./WEB-INF/classes/views_zh_TW.properties
home.class=xslt.HomePage
home.stylesheetLocation=/home.xsl
home.root=wordList
6./WEB-INF/classes/xslt/HomePage.class
package xslt;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jdom.Element;
import org.jdom.output.DOMOutputter;
import org.springframework.web.servlet.view.xslt.AbstractXsltView;
import org.w3c.dom.Node;
public class HomePage extends AbstractXsltView {
? protected Node createDomNode(
????????? Map model, String rootName, HttpServletRequest req, HttpServletResponse res
????? ) throws Exception {? ??
????????? org.jdom.Document doc = new org.jdom.Document();
????????? Element root = new Element(rootName);
????????? doc.setRootElement(root);
????????? List words = (List) model.get("wordList");
????????? for (Iterator it = words.iterator(); it.hasNext();) {
????????????? String nextWord = (String) it.next();
????????????? Element e = new Element("word");
????????????? e.setText(nextWord);
????????????? root.addContent(e);
????????? }
????????? // convert JDOM doc to a W3C Node and return
????????? return new DOMOutputter().output( doc );
????? }
}
7./WEB-INF/classes/xslt/HomePageController.class
package xslt;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class HomePageController extends AbstractController{
?protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
??Map map = new HashMap();
???? List wordList = new ArrayList();????????
???? wordList.add("hello");
???? wordList.add("world");???????
???? map.put("wordList", wordList);??????
???? return new ModelAndView("home", map);
?}
}
1.????????
Abstract
在
Java
的世界裡,要操控
XML
,最簡單的方法莫過於使用
JDOM
。在這裡我簡單的介紹如何用
JDOM
從無到有的建立一分
XML
、當有一份
XML file
時,如何將這個
XML file
讀進程式裡及如何利用
JDOM
將
XML
透過
XSLT
轉成
HTML
。
JDOM
是由
Brett Mclaughlin
和
Jason Hunter
編寫,在
http://www.jdom.org
可免費下載。
?
2.????????
建立、新增、刪除、輸出
範例
1
展示如何建立、新增、刪除及輸出一份
XML
,每份
XML
在
JDOM
裡是由一個
Document
類別代表,所以一開始我們要先
new
一個
Document
,在建構
Document
時應指明根節點,如果沒有指明,在建構應由
setRootElement
設定。基本上
XML
都可以化成一個樹狀結構,所以,在產生根節點之後,就由根節點開始增加子節點,新增的方式是呼叫
Element.addContent
將新的節點加入。刪除如果知道是某節點以下的子節點,則可呼叫
Element.getChildren
取得所有子節點,再找出要刪除的點節予以刪除。
當建立好
XML
之後,通常我們會希望將它輸出到檔案,
JDOM
提供了
XMLOutputter
類別供我們輸出之用,輸出前要先設定編碼方式,不然,會以
UTF-8
為預設值,
setNewlines
則是指明輸出時是否要幫我們斷行,方便閱讀,如果沒有加這行指令,預設是不會斷行,那麼所有資料將在同一行上。
=====
範例
1 =====
import org.jdom.*;
import org.jdom.output.*;
import java.io.*;
import java.util.List;
?
public class myCreate {
? public myCreate() {
??? String[] strChapter = { "XML
簡論
", "
編寫
XML", "
剖析
XML", "
約制
XML", "
驗正
XML", "
轉換
XML" };
?
??? Element elmtRoot = new Element("Article");
??? Document docJDOM = new Document(elmtRoot);
??? //
新增
??? for(int i=0; i<6; i++) {
????? Element elmtChapter = new Element("Chapter");
????? elmtChapter.addContent(strChapter[i]);
????? elmtChapter.setAttribute("sort", new Integer(i).toString());
????
?elmtRoot.addContent(elmtChapter);
??? }
??? //
刪除
??? List lstChapter = elmtRoot.getChildren("Chapter");
??? lstChapter.remove(4);
??? //
輸出
??? OutputXML(docJDOM, "e:/myJDOM.xml");
? }
?
? private void OutputXML(Document docXML, String strFilename) {
??? XMLOutputter fmt = new XMLOutputter();
??? try {
????? fmt.setEncoding("big5");
????? fmt.setNewlines(true);
????? FileWriter fwXML = new FileWriter(strFilename);
????? fmt.output(docXML, fwXML);
????? fwXML.close();
??? }
??? catch (IOException e) {
????
?e.printStackTrace();
??? }
? }
?
? public static void main(String[] args) {
??? myCreate myCreate1 = new myCreate();
? }
}
?
3.????????
讀進一份
XML file
目前
XML
最常被拿來應用的領域之一大概就是當作設定檔,因此,如何從檔案中讀入一份已存在的
XML
更為重要。
JDOM
是利用
SAX
或
DOM
來剖析
XML
,用
SAX
會比
DOM
,所以一般都是用
SAX
,如果對
SAX
不熟悉,在
http://www.saxproject.org/
相關文件資料。
範例
2
就是用
SAX
建立
Document
,在建立
SAXBuilder
時傳入的參數指出是否用
DTD
驗正
XML
的合法性,
true
表示要,
false
表示不要。當呼叫
build
之後
JDOM
就已經幫我們用
SAX
建立好一棵
XML Tree
,如此我們就可以很方便由
Tree
中找到我們要的節點。
?
=====
範例
2 =====
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import java.io.*;
import java.util.List;
?
public class myRead {
? public myRead() {
??? Document docJDOM;
?
??? //
利用
SAX
建立
Document
??? SAXBuilder bSAX = new SAXBuilder(false);
??? try {
????? docJDOM = bSAX.build(new File("e:/myJDOM.xml"));
??? }
??? catch (JDOMException e) {
????? e.printStackTrace();
????? return;
??? }
??? //
在根節點中加入一個新的子節點
??? Element elmtRoot = docJDOM.getRootElement();
??? Element elmtChapter = new Element("Chapter");
??? elmtChapter.setText("
驗正
XML");
??? elmtChapter.setAttribute("sort", "4");
??? elmtRoot.addContent(elmtChapter);
??? //
印出所有根節點的子節點
??? List lstChildren = elmtRoot.getChildren("Chapter");
??? for(int i=0; i<lstChildren.size(); i++) {
????? Element elmtChild = (Element) lstChildren.get(i);
????? System.out.println("Child " + i);
????? System.out.println("? Text:" + elmtChild.getText());
????? System.out.println("? Attribute:" + elmtChild.getAttributeValue("sort"));
??? }
??? //
輸出到檔案
??? OutputXML(docJDOM, "e:/myJDOM2.xml");
? }
?
? private void OutputXML(Document docXML, String strFilename) {
??? XMLOutputter fmt = new XMLOutputter();
??? try {
????? fmt.setEncoding("big5");
????? fmt.setNewlines(true);
????? FileWriter fwXML = new FileWriter(strFilename);
????? fmt.output(docXML, fwXML);
????? fwXML.close();
??? }
??? catch (IOException e) {
????? e.printStackTrace();
??? }
? }
?
? public static void main(String[] args) {
??? myRead myRead1 = new myRead();
? }
}
?
4.????????
轉換
XML
到
HTML
要將
XML
轉成
HTML
當然要先寫好
XSL
,但是即使寫好
XSL
,
JDOM
也並不提供
XML
轉換,幸好在
JDOM
安裝好之後,就會有
Apache
的
Xalan
,它可以幫我們做這樣的轉換。
要使用
Apache
的
Xalan
,首先確定
xalan.jar
在
classpath
裡。
Xalan
的第一個用法是在命令列執行,指令如下…
C:\> java org.apache.xalan.xslt.Process –IN XML
文件
–XSL XSL
樣版
–OUT
輸出檔名
命令列的用法在一般的運用裡是很方便,但是我們有興趣的是在程式裡怎麼用。範例
4
提供了一個簡單的
sample
。
=====
範例
4 =====
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.stream.*;
?
public class myGenHTML {
?
? public myGenHTML(String strXML, String strXSL, String strHTML) {
??? try {
????? GenHTML(strXML, strXSL, strHTML);
??? }
??? catch (TransformerConfigurationException e) {
????? e.printStackTrace();
??? }
??? catch (TransformerException e) {
????? e.printStackTrace();
??? }
? }
?
? private void GenHTML(String strXMLFile, String strXSLFile, String strHTMLFile) throws TransformerConfigurationException, TransformerException
? {
??? TransformerFactory myFactory = TransformerFactory.newInstance();
??? Transformer myTransformer = myFactory.newTransformer(new StreamSource(strXSLFile));
??? myTransformer.transform(new StreamSource(strXMLFile), new StreamResult(strHTMLFile));
? }
?
? public static void main(String[] args) {
??? myGenHTML myGenHTML1 = new myGenHTML(args[0], args[1], args[2]);
? }
}
1./WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
?xmlns="?xmlns:xsi="?xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
??
?<servlet>
??????? <servlet-name>hello</servlet-name>
??????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
??<init-param>
???????? <param-name>contextConfigLocation</param-name>
???????? <param-value>/WEB-INF/application-servlet.xml</param-value>
??? ?</init-param>?
??? </servlet>
?
??? <servlet-mapping>
??????? <servlet-name>hello</servlet-name>
??????? <url-pattern>*.do</url-pattern>
??? </servlet-mapping>
?
?<welcome-file-list>
??? ?<welcome-file>form.jsp</welcome-file>
? ?</welcome-file-list>
</web-app>
2./WEB-INF/application-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "<beans>
??? <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
??????? <property name="mappings">
??????????? <props>
??????????????? <prop key="/login.do">loginAction</prop>
??????????? </props>
??????? </property>
??? </bean>
???
??? <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
??????? <property name="viewClass">
??????????? <value>org.springframework.web.servlet.view.InternalResourceView</value>
??????? </property>
??????? <property name="prefix">
??????????? <value>/</value>
??????? </property>
??????? <property name="suffix">
??????????? <value>.jsp</value>
??????? </property>
??? </bean>
???
??? <bean id="loginAction" class="onlyfun.caterpillar.LoginAction">
??????? <property name="commandClass">
??????????? <value>onlyfun.caterpillar.LoginForm</value>
??????? </property>
??????? <property name="successView">
??????????? <value>success</value>
??????? </property>
??????? <property name="formView">
??????????? <value>form</value>
??????? </property>
??? </bean>
</beans>
3./WEB-INF/classes/onlyfun/caterpillar/LoginAction.class
package onlyfun.caterpillar;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet.*;
public class LoginAction extends SimpleFormController {
??? protected ModelAndView onSubmit(Object command) throws Exception {
?????? LoginForm form = (LoginForm) command;
???????
?????? if("111".equals(form.getUsername()) &&
???????????? "111".equals(form.getPassword())) {
????????? return new ModelAndView(this.getSuccessView(),"user", form.getUsername());
?????? }
?????? else {
?????????? return new ModelAndView(this.getFormView());
?????? }
??? }
}
4./WEB-INF/classes/onlyfun/caterpillar/LoginForm.class
package onlyfun.caterpillar;
public class LoginForm {
??? private String username;
??? private String password;
???
??? public void setUsername(String username) {
?????? this.username = username;
??? }
???
??? public void setPassword(String password) {
?????? this.password = password;
??? }
???
??? public String getUsername() {
?????? return username;
??? }
???
??? public String getPassword() {
?????? return password;
??? }
}
5./form.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>Login</title></head>
<body>
??? 請輸入使用者名稱與密碼:<p>
??? <form name="loginform" action="login.do" method="post">
??????? 名稱 <input type="text" name="username"/><br>
??????? 密碼 <input type="password" name="password"/><br>
??????? <input type="submit" value="確定"/>
??? </form>
??? 注意:輸入錯誤會再回到這個頁面中。
</body>
</html>
6./success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>Login Success</title></head>
<body>
??? <H1> Hello, ${user}!!</H1>
??? This is your secret gift.
</body>
</html>
1. /hellouser.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>HelloPage</title></head>
<body>
???? <H1> ${helloWord}</H2>
</body>
</html>
2./index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>
? </head>
? <body>
??? <%
??? ?response.sendRedirect("hellouser.do");
??? %>
? </body>
</html>
3./WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
?xmlns="?xmlns:xsi="?xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
??
?<servlet>
??????? <servlet-name>hello</servlet-name>
??????? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
??<init-param>
???????? <param-name>contextConfigLocation</param-name>
???????? <param-value>/WEB-INF/application-servlet.xml</param-value>
??? ?</init-param>?
??? </servlet>
?
??? <servlet-mapping>
??????? <servlet-name>hello</servlet-name>
??????? <url-pattern>*.do</url-pattern>
??? </servlet-mapping>
??
</web-app>
4./WEB-INF/application-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "<beans>
??? <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
??????? <property name="mappings">
??????????? <props>
??????????????? <prop key="/hellouser.do">helloUserAction</prop>
??????????? </props>
??????? </property>
??? </bean>
???
??? <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
??????? <property name="viewClass">
??????????? <value>org.springframework.web.servlet.view.InternalResourceView</value>
??????? </property>
??? </bean>
???
??? <bean id="helloUserAction" class="onlyfun.caterpillar.HelloUserAction">
??????? <property name="helloWord">
??????????? <value>Hello!</value>
??????? </property>
??????? <property name="viewPage">
??????????? <value>/hellouser.jsp</value>
??????? </property>
??? </bean>
</beans>
5./WEB-INF/classes/onlyfun/caterpillar/HelloUserAction.class
package onlyfun.caterpillar;
import java.io.IOException;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.RequestUtils;
public class HelloUserAction implements Controller {
?? private String helloWord;
??? private String viewPage;
???
?? public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res)
??????? throws ServletException, IOException {
???? //String user = RequestUtils.getRequiredStringParameter(req, "user");
????? Map model = new HashMap();
????? model.put("helloWord", getHelloWord());
???? // model.put("user", user);
???
?????? return new ModelAndView(getViewPage(), model);
??? }
???
??? public void setViewPage(String viewPage) {
?????? this.viewPage = viewPage;
??? }
???
??? public String getViewPage() {
?????? return viewPage;
??? }
??? public void setHelloWord(String helloWord) {
?????? this.helloWord = helloWord;
??? }
???
??? public String getHelloWord() {
?????? return helloWord;
??? }
}
1.EventRouter.js
/**
?* @author user
?*/
var jsEvent = new Array();
jsEvent.EventRouter = function(el,eventType){
?this.lsnrs = new Array();
?this.el = el;
?el.eventRouter = this;
?el[eventType] = jsEvent.EventRouter.callback;
};
jsEvent.EventRouter.prototype.addListener = function(lsnr){
?this.lsnrs.append(lsnr,true);?
} ;
jsEvent.EventRouter.prototype.notify = function(e){
?var lsnrs = this.lsnrs;
?for(var i=0;i<lsnrs.length;i++){
??var lsnr = lsnrs[i];
??lsnr.call(this,e);
?}
};
jsEvent.EventRouter.callback=function(event){
?var e = event || window.event;
?var router = this.eventRouter;
?router.notify(e);
};
Array.prototype.append = function(obj,nodup){
?if(nodup){?
??this[this.length]=obj;
?}
};
2.mousemat.css
.mousemat{
?background-color:#ffe0d0;
?border:solid maroon 0px;
?position:absolute;
?margin:0px;
?width:500px;
?height:500px;
?top:50px;
?left:50px;?
}
.thumbnail{
?background-color:#ffe0d0;
?border:solid maroon 0px;
?position:absolute;
?margin:0px;
?width:100px;
?height:100px;
?top:50px;
?left:600px;?
}
.cursor{
?background-color:blue;
?position:relative;
?height:5px;
?width:5px;
}
3.mousemat.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "<html>
?<head>
??<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
??<title>Untitled Document</title>
??<link rel='stylesheet' type = 'text/css' href = 'mousemat.css'>
??<script type ='text/javascript' src = 'EventRouter.js'></script>
??<script type='text/javascript'>
???var cursor = null;
???window.onload = function(){
????var mat = document.getElementById('mousemat');
????cursor = document.getElementById('cursor');
????var mouseRouter = new jsEvent.EventRouter(mat,"onmousemove");
????//var mouseRouter = new jsEvent.EventRouter(mat,"onclick");
????mouseRouter.addListener(writeStatus);
????mouseRouter.addListener(drawThumbnail);
???};
???function writeStatus(e){
????window.status = e.clientX + "," + e.clientY;
???}
???function drawThumbnail(e){
????cursor.style.left = ((e.clientX/5)-2) + "px";
????cursor.style.top = ((e.clientY/5)-2) + "px";
???}
??</script>
?</head>
?<body>
??<div class='mousemat' id='mousemat'></div>
??<div class='thumbnail' id='thumbnail'>
???<div class = 'cursor' id = 'cursor'></div>
??</div>
?</body>
</html>
1.mousemat.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "
<html>
?<head>
??<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
??<title>Untitled Document</title>
??<link rel='stylesheet' type = 'text/css' href = 'mousemat.css'>
??<script type='text/javascript'>
???var cursor = null;
???window.onload = function(){
????var mat = document.getElementById('mousemat');
????mat.onmousemove = mouseObserver;
????cursor = document.getElementById('cursor');
???}
???function mouseObserver(event){
????var e = event || window.event;
????writeStatus(e);
????drawThumbnail(e);
???}
???function writeStatus(e){
????window.status = e.clientX + "," + e.clientY;
???}
???function drawThumbnail(e){
????cursor.style.left = ((e.clientX/5)-2) + "px";
????cursor.style.top = ((e.clientY/5)-2) + "px";
???}
??</script>
?</head>
?<body>
??<div class='mousemat' id='mousemat'></div>
??<div class='thumbnail' id='thumbnail'>
???<div class = 'cursor' id = 'cursor'></div>
??</div>
?</body>
</html>
2.mousemat.css
mousemat{
?background-color:#ffe0d0;
?border:solid maroon 0px;
?position:absolute;
?margin:0px;
?width:500px;
?height:500px;
?top:50px;
?left:50px;?
}
.thumbnail{
?background-color:#ffe0d0;
?border:solid maroon 0px;
?position:absolute;
?margin:0px;
?width:100px;
?height:100px;
?top:50px;
?left:600px;?
}
.cursor{
?background-color:blue;
?position:relative;
?height:5px;
?width:5px;
}
1.MyHtml.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>
?<script type='text/javascript'>
??var req = null;
??var console = null;
??var READY_STATE_UNINITIALIZED = 0;
??var READY_STATE_LOADING = 1;
??var READY_STATE_LOADED = 2;
??var READY_STATE_INTERACTIVE = 3;
??var READY_STATE_COMPLETE = 4;
??
??function sendRequest(url,params,HttpMethod){
???if(!HttpMethod){
????HttpMethod = "GET";
???}
???req = initXMLHTTPRequest();
???if(req){
????req.onreadystatechange = onReadyState;
????req.open(HttpMethod,url,true);
????req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
????req.send(params);
????
???}
??}
??
??function initXMLHTTPRequest(){
???var xRequest = null;
???if(window.XMLHttpRequest){
????xRequest = new XMLHttpRequest();
???}else if(window.ActiveXObject){
????xRequest = new ActiveXObject("Microsoft.XMLHTTP");
???}
???return xRequest;
??}
??
??function onReadyState(){
???var ready = req.readyState;
???var data = null;
???if(ready==READY_STATE_COMPLETE){
????data = req.responseText;
???}else{
????data = "loading...[" + ready +"]";
???}
???toConsole(data);
??}
??
??function toConsole(data){
???if(console!=null){
????var newline = document.createElement("div");
????console.appendChild(newline);
????var txt = document.createTextNode(data);
????console.appendChild(txt);
???}
??}
??
??window.onload = function(){
???console = document.getElementById('console');
???sendRequest("data.txt");
??}
?</script>
? </head>
? ?
? <body>
? ?<DIV id ='console'></DIV>
? </body>
</html>
2.data.txt
?i'm ok!!!!!!!!
1.new_file.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "<html>
?<head>
??<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
??<title>Untitled Document</title>
??<SCRIPT type='text/javascript' src='new_file.js'></SCRIPT>
??<SCRIPT type='text/javascript'>
???window.onload = load;
??</SCRIPT>
?</head>
?<body>
??<CENTER><INPUT type='button' id='b1'></INPUT></CENTER>?
?</body>
</html>
2.new_file.js
var value = '500';
function load(){
?var domEl = document.getElementById('b1');?
?JsButton(value,domEl);
}
function JsButton(value,domEl){
?this.domEl = domEl;
?this.value = value;
?this.domEl.buttonObj = this;
?//this.domEl.onclick = function(){
??//alert(this.value);
?//}
?this.domEl.onclick = JsButton.prototype.clickHandler;
}?
JsButton.prototype.clickHandler = function(){
?//alert(this.value); 在回調函數中調用this屬性時﹐
?//得到的是對應的DOM元素裡面的數值﹐此處為空。
?var buttonObj = this.buttonObj;
?var value =(buttonObj && buttonObj.value)? buttonObj.value:"unknown value";
?alert(value);
}
1.musical_dyn_keys.css
.musicalKeys{
?background-color:#ffe0d0;
?border:solid maroon 2px;
?position:absolute;
?overflow:auto;
?margin:4px;
}
.toplong{
?width:536px;
?height:68px;
?top:24px;
?left:24px;
}
.sidebar{
?width:100px;
?height:400px;
?top:24px;
?left:570px;
}
.musicalButton{
?border:solid navy 1px;
?width:60px;
?height:60px;
?position:relative;
?margin:2px;
?float:left;
}
.do{background-color:red;}
.re{background-color:orange;}
.mi{background-color:yellow;}
.fa{background-color:green;}
.so{background-color:blue;}
.la{background-color:indigo;}
.ti{background-color:violet;}
div.console{
?font-family:arial,helvetica;
?font-size:16px;
?color:navy;
?background-color:white;
?border:solid navy 2px;
?width:536px;
?height:320px;
?top:106px;
?left:24px;
?margin:4px;
?position:absolute;
?overflow:auto;
}
2.musical_dyn_keys.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "<html>
?<head>
??<title>Two Keyboards</title>
??<LINK rel='stylesheet' type='text/css' href='musical_dyn_keys.css'/>
??<SCRIPT type='text/javascript' src='musical_dyn_keys.js'></SCRIPT>
??<SCRIPT type='text/javascript'>
???window.onload=assignKeys
??</SCRIPT>
?</head>
?<body>
??<DIV id='keyboard-top' class='toplong musicalKeys'></DIV>
??<DIV id='keyboard-side' class='sidebar musicalKeys'></DIV>
??<DIV id='console' class='console'></DIV>
?</body>
</html>
3.musical_dyn_keys.js
var notes = new Array("do","re","mi","fa","so","la","ti","do");
function assignKeys(){
?var candidates = document.getElementsByTagName("DIV");
?if(candidates){
??for(var i=0;i<candidates.length;i++){
???var candidate = candidates[i];
???if(candidate.className.indexOf('musicalKeys')>=0){
????makeKeyboard(candidate);
???}
??}
?}
}
function makeKeyboard(el){
?for(var i=0;i<notes.length;i++){
??var key=document.createElement("DIV");
??key.className = notes[i] + " musicalButton";
??alert(key.className);
??key.note = notes[i];
??key.onclick = playNote;
??el.appendChild(key);
?}?
}
function playNote(event){
?var note = this.note;
?var console = document.getElementById('console');
?if(note && console){
??console.innerHTML +=note + ".";
?}
}
1.murical.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>??
??? <link rel='stylesheet' type='text/css' href='musical.css'>
??? <script type='text/javascript' src="musical.js"></script>
??? <script type='text/javascript'>
?? window.onload = assignKeys
??? </script>??
? </head>
?
? <body>
? ?<DIV>
? ??<DIV id='keyboard' class='musicalKeys'>
???<DIV class='do musicalButton'></DIV>
???<DIV class='re musicalButton'></DIV>
???<DIV class='mi musicalButton'></DIV>
???<DIV class='fa musicalButton'></DIV>
???<DIV class='so musicalButton'></DIV>
???<DIV class='la musicalButton'></DIV>
???<DIV class='ti musicalButton'></DIV>
???<DIV class='do musicalButton'></DIV>
??</DIV>
??<DIV id='console' class='console'></DIV>
? ?</DIV>
? </body>
</html>
2.musical.css
.body{
?background-color:white;?
}
.musicalKeys{
?background-color:#ffe0d0;
?boarder:solid maroon 2px;
?width:536px;
?height:68px;
?top:24px;
?left:24px;
?margin:4px;
?position:absolute;
?overflow:auto;
}
.musicalButton{
?border:solid navy 1px;
?width:60px;
?height:60px;
?position:relative;
?margin:2px;
?float:left;
}
.do{background-color:red;}
.re{background-color:orange;}
.mi{background-color:yellow;}
.fa{background-color:green;}
.so{background-color:blue;}
.la{background-color:indigo;}
.ti{background-color:violet;}
div.console{
?font-family:arial,helvetica;
?font-size:16px;
?color:navy;
?background-color:white;
?border:solid navy 2px;
?width:536px;
?height:320px;
?top:106px;
?left:24px;
?margin:4px;
?position:absolute;
?overflow:auto;
}
3.musical.js
function assignKeys(){
?var keyboard=document.getElementById("keyboard");
?var keys = keyboard.getElementsByTagName("DIV");
?if(keys){
??for(var i=0;i<keys.length;i++){
???var key=keys[i];
???var classes=(key.className).split(" ");
???if(classes && classes.length>=2 && classes[1]=="musicalButton"){
????var note=classes[0];
????key.note=note;
????//key.onmouseover=playNote;
????key.onclick = playNote;
???}
??}
?}
}
function playNote(event){
?var note = this.note;
?var console = document.getElementById("console");
?if(note && console){
??console.innerHTML += note + ".";
?}
}
MyHtml.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>
? <script type="text/javascript" src="prototype.js"></script>
? <script type="text/javascript" src="rico.js"></script>
? <script type='text/javascript'>
???? function accordion(){
?? var outer = $('myAccordion');
?? outer.style.width = '320px';??
??new Rico.Accordion(
???outer,
???{panelHeight:400,
??? expandedBg:'#909090',
??? collapsedBg:'#404040'
???}
??);
? }
??? window.onload = accordion?
? </script>
? </head>
? <body>
?? <div id='myAccordion'>
?? ?<div>
?? ??<div>first title</div>
?? ??<div>first!!!!!</div>
?? ?</div>
?? ?<div>
?? ??<div>second title</div>
?? ??<div>second!!!!!</div>
?? ?</div>
?? </div>??
? </body>
</html>
?String sql = "INSERT INTO AB(A,B,C,D,E) VALUES(?,?,?,?,?)";
?sql = sql.toUpperCase();
?String str="
\\s*INSERT\\s+INTO\\s+([^\\(]+)\\(([^\\)]+)\\)\\s*VALUES\\s*\\(([^\\)]+)\\)\\s*";
?Pattern p = Pattern.compile(str);
?Matcher m = p.matcher(sql);
?m.find();
?String table = m.group(1);
?String cols = m.group(2);
?String values = m.group(3);
?System.out.println("table ==== " + table); //AB
?System.out.println("cols ==== " + cols); //A﹐B﹐C﹐D﹐E
?System.out.println("values ==== " + values); //﹖﹐﹖﹐﹖﹐﹖﹐﹖
註﹕.表示任何字符
??????[abc]表示abc之一字符
??????[^abc]表示非abc的一字符
??????\s表示空格﹐tab,換行﹐換頁﹐回車
???? \S表示非空格﹐tab,換行﹐換頁﹐回車
??? \d表示數字[0-9]
??? \D表示非數字[^0-9]
???\w表示詞字符[a-zA-Z0-9]
?? \W表示非詞字符[^a-zA-Z0-9]
?
匹配量詞?? X? 表示1或0個X
??????????????????X* 表示0或n個X
??????????????????X+表示1或n個X
一、概要
在JAVA應用程式特別是基於WEB的程式中,經常遇到字符的編碼問題。為了防止出現亂碼,首先需要了解JAVA是如何處理字符的,這樣就可以有目的地在輸入/輸出環節中增加必要的轉碼。其次,由於各種伺服器有不同的處理方式,還需要多做試驗,確保使用中不出現亂碼。
二、基本概念2.1 JAVA中字符的表達
JAVA中有char、byte、String這幾個概念。char 指的是一個UNICODE字符,為16位的整數。byte 是字節,字符串在網路傳輸或存儲前需要轉換為byte數組。在從網路接收或從存儲設備讀取後需要將byte數組轉換成String。String是字符串,可以看成是由char組成的數組。String 和 char 為內存形式,byte是網路傳輸或存儲的序列化形式。
舉例:
英
String ying = “英”;
char ying = ying.charAt(0);
String yingHex = Integer.toHexString(ying);
82 F1
byte yingGBBytes = ying.getBytes(“GBK”);
GB編碼的字節數值
D3 A2
?
2.2 編碼方式的簡介
String序列化成byte數組或反序列化時需要選擇正確的編碼方式。如果編碼方式不正確,就會得到一些0x3F的值。常用的字符編碼方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。
ISO8859_1用來編碼拉丁文,它由單字節(0-255)組成。
GB2312、GBK用來編碼簡體中文,它有單字節和雙字節混合組成。最高位為1的字節和下一個字節構成一個漢字,最高位為0的字節是ASCII碼。
UTF-8/UTF-16/UTF-32是國際標準UNICODE的編碼方式。 用得最多的是UTF-8,主要是因為它在對拉丁文編碼時節約空間。
UNICODE值 UTF-8編碼
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
三、J2SE中相關的函數
String str =”英”;
//取得GB2312編碼的字節
byte[] bytesGB2312 = str.getBytes(“GB2312”);
//取得平臺缺省編碼的字節(solaris為ISO8859_1,windows為GB2312)
byte[] bytesDefault = str.getBytes();
//用指定的編碼將字節轉換成字符串
String newStrGB = new String(bytesGB2312, “GB2312”);
//用平臺缺省的編碼將字節轉換成字符串(solaris為ISO8859_1,windows為GB2312)
String newStrDefault = new String(bytesDefault);
//用指定的編碼從字節流裏面讀取字符
InputStream in = xxx;
InputStreamReader reader = InputStreamReader( in, “GB2312”);
char aChar = reader.read();
四、JSP、數據庫的編碼
4.1 JSP中的編碼
(1) 靜態聲明:
CHARSET有兩個作用:
JSP文件的編碼方式:在讀取JSP文件、生成JAVA類時,源JSP文件中漢字的編碼
JSP輸出流的編碼方式:在執行JSP時,往response流裏面寫入數據的編碼方式
(2) 動態改變:在往response流裏面寫數據前可以調用response.setContentType(),設定正確的編碼類型。
(3) 在TOMCAT中,由Request.getParameter() 得到的參數,編碼方式都是ISO8859_1。所以如果在瀏覽器輸入框內輸入一個漢字“英”,在伺服器端就得到一個ISO8859_1編碼的(0x00,0xD3,0x00,0xA2)。所以通常在接收參數時轉碼:
String wrongStr = response.getParameter(“name”);
String correctStr = new String(wrongStr.getBytes(“ISO8859_1”),”GB2312”);
在最新的SERVLET規範裏面,也可以在獲取參數之前執行如下代碼:
request.setCharacterEncoding(“GB2312”);
4.2 數據庫的編碼
(1) 數據庫使用UTF-16
如果String中是UNICODE字符,寫入讀出時不需要轉碼
(2) 數據庫使用ISO8859_1
如果String中是UNICODE字符,寫入讀出時需要轉碼
寫入:String newStr = new String(oldStr.getByte(“GB2312”), “ISO8859_1”);
讀出:String newStr = new String(oldStr.getByte(“ISO8859_1”),”GB2312”);
五、源文件的編碼
5.1 資源文件
資源文件的編碼方式和編輯平臺相關。在WINDOWS平臺下編寫的資源文件,以GB2312方式編碼。在編譯時需要轉碼,以確保在各個平臺上的正確性:
native2ascii –encoding GB2312 source.properties
這樣從資源文件中讀出的就是正確的UNICODE字符串。
5.2 源文件
源文件的編碼方式和編輯平臺相關。在WINDOWS平臺下開發的源文件,以GB2312方式編碼。在編譯的時候,需要指定源文件的編碼方式:
javac –encoding GB2312
JAVA編譯後生成的字節文件的編碼為UTF-8。
點最新版TOMCAT4.1.18支援request.setCharacterEncoding(String enc)
點資源文件轉碼成company.name=\u82f1\u65af\u514b
點如果數據庫使用utf-16則不需要這部分轉碼
點頁面上應有
轉碼ⅰ:
String s = new String
(request.getParameter(“name”).getBytes(“ISO8859_1”),”GB2312”);
轉碼ⅱ:
String s = new String(name.getBytes(“GB2312”),”ISO8859_1”);
轉碼ⅲ:
String s = new String(name.getBytes(“ISO8859_1”),” GB2312”);
1.單個.class文件編譯
??首先從控制臺進入jad.exe目錄
?? 運行?jad example1.class
??(此時example1.class和jad.exe位於同一個目錄)
? 成功運行後﹐當前目錄下產生一個新文件example1.jad﹐裡面為反編譯後的java代碼
2.多個.class文件編譯
與1大致相同
輸入jad -o -dtest -sjava *.class
其中"test"表示反編譯文件的存放目錄﹐"java"表示反編譯後產生文件的後綴名
3.某文件夾下所有文件編譯
與1大致相同
輸入jad -o -dtest -sjava? tree/**/*.class
其中"test"表示反編譯文件的存放目錄﹐"java"表示反編譯後產生文件的後綴名
tree表示源文件夾名
詳細說明參看“Readme.txt”
jad下載聯接
http://www.infoxa.com/asp/soft_file/xxnr_soft_242.htm
Java操作Excel的一種方法?
?bromon原創?版權所有
MS的電子表格(Excel)是Office的重要成員,是保存統計數據的一種常用格式。作為辦公文檔,勢必要涉及到的電子文檔的交換,Excel是一種在企業中非常通用的文件格式,打印和管理也比較方便。在一個Java應用中,將一部分數據生成Excel格式,是與其他系統無縫連接的重要手段。
在開源世界中,有兩套比較有影響的API可供使用,一個是POI,一個是jExcelAPI。其中jExcelAPI是一個韓國程序員的作品,雖然沒有POI那樣血統高貴,但是在筆者的使用過程中,感覺簡單方便,對中文支持非常好,功能也比較強大。可以在sourceforge.net下載。作者的網站上對它的特征有如下描述:
?●?支持Excel?95-2000的所有版本
?●?生成Excel?2000標準格式
?●?支持字體、數字、日期操作
?●?能夠修飾單元格屬性
?●?支持圖像和圖表
應該說以上功能已經能夠大致滿足我們的需要。最關鍵的是這套API是純Java的,并不依賴Windows系統,即使運行在Linux下,它同樣能夠正確的處理Excel文件。另外需要說明的是,這套API對圖形和圖表的支持很有限,而且僅僅識別PNG格式。
搭建環境
將下載后的文件解包,得到jxl.jar,放入classpath,安裝就完成了。
?基本操作
?一、創建文件
?擬生成一個名為“測試數據.xls”的Excel文件,其中第一個工作表被命名為“第一頁”,大致效果如下:
?
?代碼(CreateXLS.java):
??
?
- //生成Excel的類
- ?import?java.io.*;
- ?import?jxl.*;
- ?import?jxl.write.*;
- ?public?class?CreateXLS
- ?{
- ? public?static?void?main(String?args[])
- ? {
- ? try
- ? {
- //打開文件
- WritableWorkbook?book=Workbook.createWorkbook(new?File(“測試.xls”));
- ?????
- //生成名為“第一頁”的工作表,參數0表示這是第一頁
- WritableSheet?sheet=book.createSheet(“第一頁”,0);
- ???
- //在Label對象的構造子中指名單元格位置是第一列第一行(0,0)
- //以及單元格內容為test
- Label?label=new?Label(0,0,”test”);
- //將定義好的單元格添加到工作表中
- sheet.addCell(label);
- /**生成一個保存數字的單元格
- *必須使用Number的完整包路徑,否則有語法歧義
- *單元格位置是第二列,第一行,值為789.123
- */
- jxl.write.Number?number?=?new?jxl.write.Number(1,0,789.123);
- sheet.addCell(number);
- //寫入數據并關閉文件
- book.write();
- book.close();
- }catch(Exception?e)
- {
- System.out.println(e);
- }
- }
- ?}?
?編譯執行后,會在當前位置產生一個Excel文件。
?三、讀取文件
?以剛才我們創建的Excel文件為例,做一個簡單的讀取操作,程序代碼如下:
??
?
- //讀取Excel的類
- ?import?java.io.*;
- ?import?jxl.*;
- ?public?class?ReadXLS
- ?{
- ?public?static?void?main(String?args[])
- ?{
- ??try
- ??{
- ???Workbook?book=
- ?Workbook.getWorkbook(new?File(“測試.xls”));
- ???
- ???//獲得第一個工作表對象
- ?Sheet?sheet=book.getSheet(0);
- ?//得到第一列第一行的單元格
- ?Cell?cell1=sheet.getCell(0,0);
- ?String?result=cell1.getContents();
- ?System.out.println(result);
- ?book.close();
- ??}catch(Exception?e)
- ??{
- ???System.out.println(e);
- ??}
- ?}
- ?}?
?程序執行結果:test
?四、修改文件
?利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的時候,除了打開文件的方式不同之外,其他操作和創建Excel是一樣的。下面的例子是在我們已經生成的Excel文件中添加一個工作表:
?
- //修改Excel的類,添加一個工作表
- ?import?java.io.*;
- ?import?jxl.*;
- ?import?jxl.write.*;
- ?public?class?UpdateXLS
- ?{
- ?public?static?void?main(String?args[])
- ?{
- ??try
- ??{
- ???//Excel獲得文件
- ???Workbook?wb=Workbook.getWorkbook(new?File(“測試.xls”));
- ???
- ???//打開一個文件的副本,并且指定數據寫回到原文件
- ?WritableWorkbook?book=
- ?Workbook.createWorkbook(new?File(“測試.xls”),wb);
- ???
- ???//添加一個工作表
- ???WritableSheet?sheet=book.createSheet(“第二頁”,1);
- ???sheet.addCell(new?Label(0,0,”第二頁的測試數據”));
- ???
- ???book.write();
- ???book.close();
- ??}catch(Exception?e)
- ??{
- ???System.out.println(e);
- ??}
- ?}
- ?}?
?執行結果如圖:
?
?高級操作
?一、?數據格式化
?在Excel中不涉及復雜的數據類型,能夠比較好的處理字串、數字和日期已經能夠滿足一般的應用。
?1、?字串格式化
?字符串的格式化涉及到的是字體、粗細、字號等元素,這些功能主要由WritableFont和WritableCellFormat類來負責。假設我們在生成一個含有字串的單元格時,使用如下語句,為方便敘述,我們為每一行命令加了編號:
?
- WritableFont?font1=
- ?new?WritableFont(WritableFont.TIMES,16,WritableFont.BOLD);?①
- ?WritableCellFormat?format1=new?WritableCellFormat(font1);?②
- ?Label?label=new?Label(0,0,”data?4?test”,format1)?③
?其中①指定了字串格式:字體為TIMES,字號16,加粗顯示。WritableFont有非常豐富的構造子,供不同情況下使用,jExcelAPI的java-doc中有詳細列表,這里不再列出。
?②處代碼使用了WritableCellFormat類,這個類非常重要,通過它可以指定單元格的各種屬性,后面的單元格格式化中會有更多描述。
?③處使用了Label類的構造子,指定了字串被賦予那種格式。
?在WritableCellFormat類中,還有一個很重要的方法是指定數據的對齊方式,比如針對我們上面的實例,可以指定:
?
- //把水平對齊方式指定為居中
- ?format1.setAlignment(jxl.format.Alignment.CENTRE);
?
- //把垂直對齊方式指定為居中
- ?format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
?二、單元格操作
?Excel中很重要的一部分是對單元格的操作,比如行高、列寬、單元格合并等,所幸jExcelAPI提供了這些支持。這些操作相對比較簡單,下面只介紹一下相關的API。
?1、?合并單元格
?
- WritableSheet.mergeCells(int?m,int?n,int?p,int?q);?
?作用是從(m,n)到(p,q)的單元格全部合并,比如:
?
- WritableSheet?sheet=book.createSheet(“第一頁”,0);
?//合并第一列第一行到第六列第一行的所有單元格
?
- sheet.mergeCells(0,0,5,0);
?合并既可以是橫向的,也可以是縱向的。合并后的單元格不能再次進行合并,否則會觸發異常。
?2、?行高和列寬
?
- WritableSheet.setRowView(int?i,int?height);
?作用是指定第i+1行的高度,比如:
?//將第一行的高度設為200
?
- sheet.setRowView(0,200);
- ?WritableSheet.setColumnView(int?i,int?width);
?作用是指定第i+1列的寬度,比如:
?//將第一列的寬度設為30
?
- sheet.setColumnView(0,30);
?jExcelAPI還有其他的一些功能,比如插入圖片等,這里就不再一一介紹,讀者可以自己探索。
可以用Java讀取Microsoft Excel文件。微軟提供了一個Excel的ODBC驅動程序,因此我們就可以使用JDBC和Sun的JDBC-ODBC驅動來讀取Excel文件了。
??如果你有個Excel文件,名為Book1.xls(譯者注:由于原文的例子我沒有下載下來,所以我用了自己的例子),并且,該文件中有一個工作表(sheet)名為Sheet1
??
微軟的ODBC驅動程序把工作表中的第一行作為列名(譯者注:即字段名),工作表名作為數據庫表名。
??要通過JDBC訪問工作表,我們還必須創建一個新的ODBC數據源,在Windows 2000系統上創建數據源的過程如下:
進入“控制面板” --> “管理工具” --> “數據源(ODBC)”,(譯者注:打開后選擇系統DSN),點擊添加,在彈出窗口中選擇“Driver do Microsoft Excel(*.xls)”
然后在數據源名處輸入你一個名字Book1(譯者注:相當于數據庫名),然后點擊“選擇工作簿”,然后找到并選取你的Excel文件
點擊確定后,系統數據源列表中會出現你設置的數據源名稱,
??
??現在數據表已經在數據源列表里了(譯者注:點擊確定完成配置)。
??(譯者注:我的例子中)現在如果我們想挑出test1列中的所有“測試”值,那就需要用以下的SQL查詢:
??SELECT test1 FROM [Sheet1$] WHERE test1='測試'
??要注意的是工作表名后面跟了一個“$”符號,這個符號是不可缺少的。為什么?因為他的前后有方括號,因為“$”是SQL語句中的保留字。Life is never easy(譯者注:作者發感慨了)。
下面是例子程序:
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;
public class ExcelReader {
????public static void main( String[] args ) {
????????Connection c = null;
????????Statement stmnt = null;
????????try {
????????????Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
????????????c = DriverManager.getConnection( "jdbc:odbc:Book1", "", "" );
????????????stmnt = c.createStatement();
????????????String query = "SELECT test1 FROM [Sheet1$] WHERE test1='測試'";
????????????ResultSet rs = stmnt.executeQuery( query );
????????????
????????????System.out.println( "查得匹配'測試'的test1的記錄為:" );
????????????while( rs.next() ) {
????????????????System.out.println( rs.getString( "test1" ) );
????????????}
????????}
????????catch( Exception e ) {
????????????System.err.println( e );
????????}
????????finally {
????????????try {
????????????????stmnt.close();
????????????????c.close();
????????????}
????????????catch( Exception e ) {
????????????????System.err.println( e );
????????????}
????????}
????}
}
在此程序中,主函數main() 建立了一個數據表的連接,并取出符合條件的記錄。
(譯者注:另外,我這里還有一段程序,是讀取所有記錄的程序,僅作參考):
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.DriverManager;
public class ExcelReader {
????public static void main(String[] args){
????????Connection connection = null;
????????try{
????????????Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
????????????Connection con = DriverManager.getConnection( "jdbc:odbc:Book1","","" );
????????????Statement st = con.createStatement();
????????????ResultSet rs = st.executeQuery( "SELECT * FROM [Sheet1$]" );
????????????ResultSetMetaData rsmd = rs.getMetaData();
????????????int numberOfColumns = rsmd.getColumnCount();
????????????while (rs.next()) {
????????????????for (int i = 1; i <= numberOfColumns; i++) {
????????????????????if(i>1)??//用逗號分隔各列
??????System.out.print(", ");
????????????????????String columnValue = rs.getString(i);
????????????????????System.out.print(columnValue);
????????????????}
????????????????System.out.println("");
????????????}
????????????st.close();
????????????con.close();
????????} catch(Exception ex) {
????????????System.err.print("Exception: ");
????????????System.err.println(ex.getMessage());
????????}
????}
}
?
SQL中的單記錄函數
1.ASCII
返回與指定的字符對應的十進制數;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
??????? A???????? A????? ZERO???? SPACE
--------- --------- --------- ---------
?????? 65??????? 97??????? 48??????? 32
2.CHR
給出整數,返回對應的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;
ZH C
-- -
趙 A
3.CONCAT
連接兩個字符串;
SQL> select concat('010-','88888888')||'轉23'? 高乾競電話 from dual;
高乾競電話
----------------
010-88888888轉23
4.INITCAP
返回字符串并將字符串的第一個字母變為大寫;
SQL> select initcap('smith') upp from dual;
UPP
-----
Smith
5.INSTR(C1,C2,I,J)
在一個字符串中搜索指定的字符,返回發現指定的字符的位置;
C1??? 被搜索的字符串
C2??? 希望搜索的字符串
I???? 搜索的開始位置,默認為1
J???? 出現的位置,默認為1
SQL> select instr('oracle traning','ra',1,2) instring from dual;
?INSTRING
---------
??????? 9
6.LENGTH
返回字符串的長度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;
NAME?? LENGTH(NAME) ADDR???????????? LENGTH(ADDR)?????? SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾競??????????? 3 北京市海錠區??????????????? 6?? 9999.99??????????????????? 7
?
7.LOWER
返回字符串,并將所有的字符小寫
SQL> select lower('AaBbCcDd')AaBbCcDd from dual;
AABBCCDD
--------
aabbccdd
8.UPPER
返回字符串,并將所有的字符大寫
SQL> select upper('AaBbCcDd') upper from dual;
UPPER
--------
AABBCCDD
?
9.RPAD和LPAD(粘貼字符)
RPAD? 在列的右邊粘貼字符
LPAD? 在列的左邊粘貼字符
SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;
LPAD(RPAD('GAO',1
-----------------
*******gao*******
不夠字符則用*來填滿
10.LTRIM和RTRIM
LTRIM? 刪除左邊出現的字符串
RTRIM? 刪除右邊出現的字符串
SQL> select ltrim(rtrim('?? gao qian jing?? ',' '),' ') from dual;
LTRIM(RTRIM('
-------------
gao qian jing
11.SUBSTR(string,start,count)
取子字符串,從start開始,取count個
SQL> select substr('13088888888',3,8) from dual;
SUBSTR('
--------
08888888
12.REPLACE('string','s1','s2')
string?? 希望被替換的字符或變量
s1?????? 被替換的字符串
s2?????? 要替換的字符串
SQL> select replace('he love you','he','i') from dual;
REPLACE('H
----------
i love you
13.SOUNDEX
返回一個與給定的字符串讀音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');
SQL> select xm from table1 where soundex(xm)=soundex('weather');
XM
--------
weather
wether
14.TRIM('s' from 'string')
LEADING?? 剪掉前面的字符
TRAILING? 剪掉后面的字符
如果不指定,默認為空格符
15.ABS
返回指定值的絕對值
SQL> select abs(100),abs(-100) from dual;
?ABS(100) ABS(-100)
--------- ---------
????? 100?????? 100
16.ACOS
給出反余弦的值
SQL> select acos(-1) from dual;
?ACOS(-1)
---------
3.1415927
17.ASIN
給出反正弦的值
SQL> select asin(0.5) from dual;
ASIN(0.5)
---------
.52359878
18.ATAN
返回一個數字的反正切值
SQL> select atan(1) from dual;
? ATAN(1)
---------
.78539816
19.CEIL
返回大于或等于給出數字的最小整數
SQL> select ceil(3.1415927) from dual;
CEIL(3.1415927)
---------------
????????????? 4
20.COS
返回一個給定數字的余弦
SQL> select cos(-3.1415927) from dual;
COS(-3.1415927)
---------------
???????????? -1
21.COSH
返回一個數字反余弦值
SQL> select cosh(20) from dual;
?COSH(20)
---------
242582598
22.EXP
返回一個數字e的n次方根
SQL> select exp(2),exp(1) from dual;
?? EXP(2)??? EXP(1)
--------- ---------
7.3890561 2.7182818
23.FLOOR
對給定的數字取整數
SQL> select floor(2345.67) from dual;
FLOOR(2345.67)
--------------
????????? 2345
24.LN
返回一個數字的對數值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;
??? LN(1)???? LN(2) LN(2.7182818)
--------- --------- -------------
??????? 0 .69314718???? .99999999
25.LOG(n1,n2)
返回一個以n1為底n2的對數
SQL> select log(2,1),log(2,4) from dual;
?LOG(2,1)? LOG(2,4)
--------- ---------
??????? 0???????? 2
26.MOD(n1,n2)
返回一個n1除以n2的余數
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;
MOD(10,3)? MOD(3,3)? MOD(2,3)
--------- --------- ---------
??????? 1???????? 0???????? 2
27.POWER
返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual;
POWER(2,10) POWER(3,3)
----------- ----------
?????? 1024???????? 27
28.ROUND和TRUNC
按照指定的精度進行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;
ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
???????? 56????????? -55????????? 55????????? -55
29.SIGN
取數字n的符號,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual;
SIGN(123) SIGN(-100)?? SIGN(0)
--------- ---------- ---------
??????? 1???????? -1???????? 0
30.SIN
返回一個數字的正弦值
SQL> select sin(1.57079) from dual;
SIN(1.57079)
------------
?????????? 1
31.SIGH
返回雙曲正弦的值
SQL> select sin(20),sinh(20) from dual;
? SIN(20)? SINH(20)
--------- ---------
.91294525 242582598
32.SQRT
返回數字n的根
SQL> select sqrt(64),sqrt(10) from dual;
?SQRT(64)? SQRT(10)
--------- ---------
??????? 8 3.1622777
33.TAN
返回數字的正切值
SQL> select tan(20),tan(10) from dual;
? TAN(20)?? TAN(10)
--------- ---------
2.2371609 .64836083
34.TANH
返回數字n的雙曲正切值
SQL> select tanh(20),tan(20) from dual;
?TANH(20)?? TAN(20)
--------- ---------
??????? 1 2.2371609
?
35.TRUNC
按照指定的精度截取一個數
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;
?? TRUNC1 TRUNC(124.16666,2)
--------- ------------------
????? 100???????????? 124.16
?
36.ADD_MONTHS
增加或減去月份
SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;
TO_CHA
------
200002
SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;
TO_CHA
------
199910
37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;
TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;
LAST_DAY(S
----------
31-5月 -04
38.MONTHS_BETWEEN(date2,date1)
給出date2-date1的月份
SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;
MON_BETWEEN
-----------
????????? 9
SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;
?MON_BETW
---------
????? -60
39.NEW_TIME(date,'this','that')
給出在this時區=other時區的日期和時間
SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time
? 2? (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;
BJ_TIME???????????? LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32
40.NEXT_DAY(date,'day')
給出日期date和星期x之后計算下一個星期的日期
SQL> select next_day('18-5月-2001','星期五') next_day from dual;
NEXT_DAY
----------
25-5月 -01
?
41.SYSDATE
用來得到系統的當前日期
SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;
TO_CHAR(SYSDATE,'
-----------------
09-05-2004 星期日
trunc(date,fmt)按照給出的要求將日期截斷,如果fmt='mi'表示保留分,截斷秒
SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,
? 2? to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;
HH????????????????? HHMM
------------------- -------------------
2004.05.09 11:00:00 2004.05.09 11:17:00
?
42.CHARTOROWID
將字符數據類型轉換為ROWID類型
SQL> select rowid,rowidtochar(rowid),ename from scott.emp;
ROWID????????????? ROWIDTOCHAR(ROWID) ENAME
------------------ ------------------ ----------
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES
43.CONVERT(c,dset,sset)
將源字符串 sset從一個語言字符集轉換到另一個目的dset字符集
SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;
conver
------
strutz
44.HEXTORAW
將一個十六進制構成的字符串轉換為二進制
45.RAWTOHEXT
將一個二進制構成的字符串轉換為十六進制
?
46.ROWIDTOCHAR
將ROWID數據類型轉換為字符類型
?
47.TO_CHAR(date,'format')
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2004/05/09 21:14:41
?
48.TO_DATE(string,'format')
將字符串轉化為ORACLE中的一個日期
49.TO_MULTI_BYTE
將字符串中的單字節字符轉化為多字節字符
SQL>? select to_multi_byte('高') from dual;
TO
--
高
50.TO_NUMBER
將給出的字符轉換為數字
SQL> select to_number('1999') year from dual;
???? YEAR
---------
???? 1999
51.BFILENAME(dir,file)
指定一個外部二進制文件
SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));
52.CONVERT('x','desc','source')
將x字段或變量的源source轉換為desc
SQL> select sid,serial#,username,decode(command,
? 2? 0,'none',
? 3? 2,'insert',
? 4? 3,
? 5? 'select',
? 6? 6,'update',
? 7? 7,'delete',
? 8? 8,'drop',
? 9? 'other') cmd? from v$session where type!='background';
????? SID?? SERIAL# USERNAME?????????????????????? CMD
--------- --------- ------------------------------ ------
??????? 1???????? 1??????????????????????????????? none
??????? 2???????? 1??????????????????????????????? none
??????? 3???????? 1??????????????????????????????? none
??????? 4???????? 1??????????????????????????????? none
??????? 5???????? 1??????????????????????????????? none
??????? 6???????? 1??????????????????????????????? none
??????? 7????? 1275??????????????????????????????? none
??????? 8????? 1275??????????????????????????????? none
??????? 9??????? 20 GAO??????????????????????????? select
?????? 10??????? 40 GAO??????????????????????????? none
53.DUMP(s,fmt,start,length)
DUMP函數以fmt指定的內部數字格式返回一個VARCHAR2類型的值
SQL> col global_name for a30
SQL> col dump_string for a50
SQL> set lin 200
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;
GLOBAL_NAME??????????????????? DUMP_STRING
------------------------------ --------------------------------------------------
ORACLE.WORLD?????????????????? Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D
54.EMPTY_BLOB()和EMPTY_CLOB()
這兩個函數都是用來對大數據類型字段進行初始化操作的函數
55.GREATEST
返回一組表達式中的最大值,即比較字符的編碼大小.
SQL> select greatest('AA','AB','AC') from dual;
GR
--
AC
SQL> select greatest('啊','安','天') from dual;
GR
--
天
56.LEAST
返回一組表達式中的最小值
SQL> select least('啊','安','天') from dual;
LE
--
啊
57.UID
返回標識當前用戶的唯一整數
SQL> show user
USER 為"GAO"
SQL> select username,user_id from dba_users where user_id=uid;
USERNAME???????????????????????? USER_ID
------------------------------ ---------
GAO?????????????????????????????????? 25
?
58.USER
返回當前用戶的名字
SQL> select user from? dual;
USER
------------------------------
GAO
59.USEREVN
返回當前用戶環境的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA? 查看當前用戶是否是DBA如果是則返回true
SQL> select userenv('isdba') from dual;
USEREN
------
FALSE
SQL> select userenv('isdba') from dual;
USEREN
------
TRUE
SESSION
返回會話標志
SQL> select userenv('sessionid') from dual;
USERENV('SESSIONID')
--------------------
???????????????? 152
ENTRYID
返回會話人口標志
SQL> select userenv('entryid') from dual;
USERENV('ENTRYID')
------------------
???????????????? 0
INSTANCE
返回當前INSTANCE的標志
SQL> select userenv('instance') from dual;
USERENV('INSTANCE')
-------------------
????????????????? 1
LANGUAGE
返回當前環境變量
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG
返回當前環境的語言的縮寫
SQL> select userenv('lang') from dual;
USERENV('LANG')
----------------------------------------------------
ZHS
TERMINAL
返回用戶的終端或機器的標志
SQL> select userenv('terminal') from dual;
USERENV('TERMINA
----------------
GAO
VSIZE(X)
返回X的大小(字節)數
SQL> select vsize(user),user from dual;
VSIZE(USER) USER
----------- ------------------------------
????????? 6 SYSTEM
?
60.AVG(DISTINCT|ALL)
all表示對所有的值求平均值,distinct只對不同的值求平均值
SQLWKS> create table table3(xm varchar(8),sal number(7,2));
語句已處理。
SQLWKS>? insert into table3 values('gao',1111.11);
SQLWKS>? insert into table3 values('gao',1111.11);
SQLWKS>? insert into table3 values('zhu',5555.55);
SQLWKS> commit;
SQL> select avg(distinct sal) from gao.table3;
AVG(DISTINCTSAL)
----------------
???????? 3333.33
SQL> select avg(all sal) from gao.table3;
AVG(ALLSAL)
-----------
??? 2592.59
61.MAX(DISTINCT|ALL)
求最大值,ALL表示對所有的值求最大值,DISTINCT表示對不同的值求最大值,相同的只取一次
SQL> select max(distinct sal) from scott.emp;
MAX(DISTINCTSAL)
----------------
??????????? 5000
62.MIN(DISTINCT|ALL)
求最小值,ALL表示對所有的值求最小值,DISTINCT表示對不同的值求最小值,相同的只取一次
SQL> select min(all sal) from gao.table3;
MIN(ALLSAL)
-----------
??? 1111.11
63.STDDEV(distinct|all)
求標準差,ALL表示對所有的值求標準差,DISTINCT表示只對不同的值求標準差
SQL> select stddev(sal) from scott.emp;
STDDEV(SAL)
-----------
? 1182.5032
SQL> select stddev(distinct sal) from scott.emp;
STDDEV(DISTINCTSAL)
-------------------
?????????? 1229.951
?
64.VARIANCE(DISTINCT|ALL)
求協方差
SQL> select variance(sal) from scott.emp;
VARIANCE(SAL)
-------------
??? 1398313.9
65.GROUP BY
主要用來對一組數進行統計
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;
?? DEPTNO? COUNT(*)? SUM(SAL)
--------- --------- ---------
?????? 10???????? 3????? 8750
?????? 20???????? 5???? 10875
?????? 30???????? 6????? 9400
?
66.HAVING
對分組統計再加限制條件
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;
?? DEPTNO? COUNT(*)? SUM(SAL)
--------- --------- ---------
?????? 20???????? 5???? 10875
?????? 30???????? 6????? 9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;
?? DEPTNO? COUNT(*)? SUM(SAL)
--------- --------- ---------
?????? 20???????? 5???? 10875
?????? 30???????? 6????? 9400
67.ORDER BY
用于對查詢到的結果進行排序輸出
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;
?? DEPTNO ENAME??????????? SAL
--------- ---------- ---------
?????? 10 KING??????????? 5000
?????? 10 CLARK?????????? 2450
?????? 10 MILLER????????? 1300
?????? 20 SCOTT?????????? 3000
?????? 20 FORD??????????? 3000
?????? 20 JONES?????????? 2975
?????? 20 ADAMS?????????? 1100
?????? 20 SMITH??????????? 800
?????? 30 BLAKE?????????? 2850
?????? 30 ALLEN?????????? 1600
?????? 30 TURNER????????? 1500
?????? 30 WARD??????????? 1250
?????? 30 MARTIN????????? 1250
?????? 30 JAMES??????????? 950
如何從一位菜鳥蛻變成為高手,靈活使用的SQL語句是必不可少的。本文收集了部分比較經典,常用的SQL語句供大家參考,希望對大家有所幫助。
說明:復制表(只復制結構,源表名:a 新表名:b)
SQL: select * into b from a where 1<>1
說明:拷貝表(拷貝數據,源表名:a 目標表名:b)
SQL: insert into b(a, b, c) select d,e,f from b;
說明:顯示文章、提交人和最后回復時間
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
說明:外連接查詢(表名1:a 表名2:b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
說明:日程安排提前五分鐘提醒
SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5
說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
SQL:
delete from info where not exists ( select * from infobz where info.infid=infobz.infid
說明:--
SQL:
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,
(SELECT NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') ¦¦ '/01','YYYY/MM/DD') - 1, 'YYYY/MM') Y,
WHERE X.NUM = Y.NUM (+)
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND B
WHERE A.NUM = B.NUM
說明:--
SQL:
select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名稱='"&strdepartmentname&"' and 專業名稱='"&strprofessionname&"' order by 性別,生源地,高考總成績
說明:
從數據庫中去一年的各單位電話費統計(電話費定額賀電化肥清單兩個表來源)
SQL:
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC
FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
FROM TELFEESTAND a, TELFEE b
WHERE a.tel = b.telfax) a
GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')
說明:四表聯查問題:
SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
說明:得到表中最小的未使用的ID號
SQL:
SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID
FROM Handle
WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)
OC4J里配置數據源:
1.application.xml的<data-sources>元素必須指出data-sources.xml文件的文件名和路徑,即:
<data-sources
path = "data-sources.xml"
/>
一般application.xml文件和data-sources.xml 文件都在j2ee/home/config/下。所以<data-sources>元素的path屬性只包括data-sources.xml的文件名;
2.data-sources.xml文件中定義數據源:
<data-source
?class="com.evermind.sql.DriverManagerDataSource"
?name="OracleDS"
?location="jdbc/OracleCoreDS"
?xa-location="jdbc/xa/OracleXADS"
?ejb-location="jdbc/OracleDS"
?connection-driver="oracle.jdbc.driver.OracleDriver"
?username="hr"
?password="hr"
?url="jdbc:oracle:thin:@myhost:1521:ORCL"
?inactivity-timeout="30"
/>
class屬性定義需要定義的數據源類型;
location、xa-location和ejb-location定義JNDI名字;
connection-driver指出連接驅動。
例如:
?<data-source
??class="com.evermind.sql.DriverManagerDataSource"
??name="MyConnection"
??location="jdbc/MyConnection"
??connection-driver="oracle.jdbc.driver.OracleDriver"
??username="portal"
??password="pportalgis"
??url="jdbc:oracle:thin:@172.18.2.6:1521:apps"
??inactivity-timeout="30"
??max-connections="50"
??max-connect-attempts="2"
??min-connections="4"
?/>
2.程序調用:
Context env= new InitialContext();
DataSource pool= (DataSource)env.lookup("jdbc/MyConnection");
Connection conn=pool.getConnection();
oracle.jdbc.OracleConnection 分為:
?getConnection(); //數據源中已定義用戶名和密碼
?getConnection(String username, String password); //數據源中未定義用戶名和密碼
可以如下:
oracle.jdbc.OracleConnection conn =(oracle.jdbc.OracleConnection) pool.getConnection();