`

JAVA EE JSP collection

阅读更多

http://guoqinhua1986-126-com.iteye.com/blog/231244

********************解决乱码问题(格式化)***********
//格式化---转换为GBK
public String fs(String str) {
try {
byte[] st = str.getBytes();
str = new String(st, "GBK");
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
} // new java.util.Date(); -->java.sql.Date()
return str.trim();
}
//格式化---转换为ISO-8859-1
public String fg(String str) {
try {
byte[] st = str.getBytes("ISO-8859-1");
str = new String(st);
} catch (Exception ex) {
ex.pr

********************jsp+javascript打造级连菜单***********
<%@ page import="java.util.Date,yava.fileapp.*,java.sql.*;"
contentType="text/html;charset=GB2312" pageEncoding="GB2312"
%>
<style>
.f9{ font-size:9pt; }
.bgc{ background-color:#AECAF9; color: #0033FF }
.buttons{font-family:Arial; font-size:13px; font-weight:bold; background-color:#6796E4; color:white; border-top: solid 2px #AACAFB;
border-bottom: solid 1px #4E7DC1;
border-left: solid 1px #AECAF9;
border-right: solid 1px #5679BD;
padding:1px;
margin:0px;}
</style>
<SCRIPT LANGUAGE="JavaScript">
<!--
function rv()
{
var val="";
for(i=0;i<combo_box.list2.length;i++){
val+=","+combo_box.list2[i].value;
}
if(val.charAt(0)==","){
val=val.substr(1,val.length);
}
opener.form1.frecname.value=val;
self.close();
}
//-->
</SCRIPT>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<jsp:useBean id="user" scope="session" class="yava.fileapp.UserBean" />
<%
CDataSource ds=new CDataSource(); //数据联结Bean实例
java.sql.Connection conn=ds.getConnection();
java.sql.Statement stmt=null;
java.sql.ResultSet rs=null;
CDataCheck dc=new CDataCheck();
%>
<%
String sqlu="SELECT t1.fno, t1.fname, t2.fname AS fdept FROM tuser t1 LEFT OUTER JOIN TDept t2 ON t1.fdept = t2.fno order by t2.fname";
stmt=conn.createStatement();
rs=stmt.executeQuery(sqlu);
%>
<script language="Javascript">
arr = new Array();
<% int temp=0;
while(rs.next())
{
%>
arr[<%=temp%>]=new Array("<%=rs.getString("fname")%>","<%=rs.getString("fdept")%>");
<%
temp = temp + 1;
}
%>
temp=<%=temp%>;
function ChangeLocation(id){
document.combo_box.city.length=0; //初始化第2级菜单的长度,下标从0开始
var i = 0;
document.combo_box.city.options[0]=new Option("-------","");
for(i=0;i<temp;i++){
if(arr[i][1]==id){//如果相等,证明在第2级里面有输入第1级组织的子集,arr[总数目][部门]
document.combo_box.city.options[document.combo_box.city.length] = new Option(arr[i][0], arr[i][0]);
}
}
}
</script>

<form name="combo_box">
<table border="0" cellspacing="0" cellpadding="0" height="210" width="59">
<tr height="24">
<td bgcolor="#336699" class="buttons" align=center><font color=#ffffff>部门选择</font></td>
<td bgcolor="#336699" class="buttons" align=center><font color=#ffffff>人名选择</font></td>
<td bgcolor="#336699" class="buttons" align=center nowrap><font color=#ffffff>添加/移除</font></td>
<td bgcolor="#336699" class="buttons" align=center><font color=#ffffff>最终人</font></td>
</tr>
<tr>
<td>
<select multiple id=prov name="prov" onchange="ChangeLocation(combo_box.prov.options[combo_box.prov.selectedIndex].text);" style="width:150;height:200" class="bgc">
<option value="0">请选择部门 ---></option>
<%
String sqld="SELECT * FROM tdept";
stmt=conn.createStatement();
rs=stmt.executeQuery(sqld);
while(rs.next())
{
%>
<option name="<%=rs.getString("fno")%>"><%=rs.getString("fname")%></option>
<%
}
%>
</select>
</td>
<td>
<select multiple id=city style="width:150;height:200" class="bgc">
</select>
</td>
<td nowrap align="center" class="bgc">
<input type="button" onClick="move(this.form.list2,this.form.city)" value="<<" class="buttons">
<input type="button" onClick="move(this.form.city,this.form.list2)" value=">>" class="buttons">
</td>
<td>
<select multiple size="10" name="list2" style="width:150;height:200" class="bgc">
</select>
</td>
</tr>
<tr class="bgc">
<td colspan="4" align="center"><input type="button" name="button1" class="buttons" value="选好了!" onclick="rv();"></td>
</tr>
</table>
</form>
<script language="JavaScript">
//人名移动
function move(fbox, tbox) {
var arrFbox = new Array();
var arrTbox = new Array();
var arrLookup = new Array();
var i;
for (i = 0; i < tbox.options.length; i++) {
arrLookup[tbox.options[i].text] = tbox.options[i].value;
arrTbox[i] = tbox.options[i].text;
}
var fLength = 0;
var tLength = arrTbox.length;
for(i = 0; i < fbox.options.length; i++) {
arrLookup[fbox.options[i].text] = fbox.options[i].value;
if (fbox.options[i].selected && fbox.options[i].value != "") {
arrTbox[tLength] = fbox.options[i].text;
tLength++;
}
else {
arrFbox[fLength] = fbox.options[i].text;
fLength++;
}
}
arrFbox.sort();
arrTbox.sort();
fbox.length = 0;
tbox.length = 0;
var c;
for(c = 0; c < arrFbox.length; c++) {
var no = new Option();
no.value = arrLookup[arrFbox[c]];
no.text = arrFbox[c];
fbox[c] = no;
}
for(c = 0; c < arrTbox.length; c++) {
var no = new Option();
no.value = arrLookup[arrTbox[c]];
no.text = arrTbox[c];
tbox[c] = no;
}
}
</script>
</body>

********************jsp实现图形验证码***********

调用方法
<img src="http://...../getImg">

原理,在servlet中随机生成一个4位数字1000-9999
然后把这数字写入session
输出一个图片,上面写有这四个数字
在服务器端根据用户输入的数字和
session中的值比较。


package com.schoolwx.util;
import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
/**
* Title: getImg.java
* Description: 这个class主要实现随机生成一个4位数的验证码,并写入session,
* Copyright: Copyright (c) 2003
* Company: 蓝星软件
* @author falcon
* @version 1.1
*/
public class getImg extends HttpServlet {
private Font mFont=new Font("宋体", Font.PLAIN,12);//设置字体
//处理post
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doGet(request,response);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
//取得一个1000-9999的随机数
String s="";
int intCount=0;
intCount=(new Random()).nextInt(9999);//
if(intCount<1000)intCount+=1000;
s=intCount+"";
//对session付值。
HttpSession session=request.getSession (true);
session.setAttribute("getImg",s);
response.setContentType("image/gif");
ServletOutputStream out=response.getOutputStream();
BufferedImage image=new BufferedImage(35,14,BufferedImage.TYPE_INT_RGB);
Graphics gra=image.getGraphics();
//设置背景色
gra.setColor(Color.yellow);
gra.fillRect(1,1,33,12);
//设置字体色
gra.setColor(Color.black);
gra.setFont(mFont);
//输出数字
char c;
for(int i=0;i<4;i++) {
c=s.charAt(i);
gra.drawString(c+"",i*7+4,11); //7为宽度,11为上下高度位置
}
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
}

********************JSP调用报表示例***********

<%@ page language="java" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
request.setCharacterEncoding( "GBK" );
%>
<%@taglib uri="/WEB-INF/runqianReport4.tld" prefix="report" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>帶分頁的報表</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link href="<%=basePath%>/styles/css1.css" rel="stylesheet" type="text/css">

<%
String hong="hong=select * from ukehu where yid =""+request.getParameter("name")+""";

%>
</head>

<body>
<center>
<report:html name="report1" reportFileName="红参数.raq"
srcType="file"
params="<%=hong%>"

scale="1"
width="-1"
funcBarLocation="bottom"
separator=" "

needSaveAsExcel="yes"
needSaveAsPdf="yes"
needSaveAsWord="yes"
needPrint="yes"

printLabel="<input name="print_btn" type="button" class="btn001" value="print">"
savePrintSetup="yes"
printedRaq="红参数.raq"

excelLabel="<input name="exportExcel_btn" type="button" class="btn001" value="To Excel">"
pdfLabel="<input name="exportPdf_btn" type="button" class="btn001" value="To PDF">"
wordLabel="<input name="exportWrod_btn" type="button" class="btn001" value="To Word">"
saveAsName="userlist"

needScroll="no"
needPageMark="yes"
firstPageLabel="<input name="firstPage_btn" type="button" class="btn001" value="第一页 ">"
prevPageLabel="<input name="prevPage_btn" type="button" class="btn001" value="上一页">"
nextPageLabel="<input name="nextPage_btn" type="button" class="btn001" value="下一页">"
lastPageLabel="<input name="lastPage_btn" type="button" class="btn001" value="尾页">"
displayNoLinkPageMark="yes"

/>
</center>
</body>
</html>

********************JSP分页***********

一 前提
希望最新的纪录在开头给你的表建立查询:
表:mytable
查询:create or replace view as mytable_view from mytable order by id desc 其中,最好使用序列号create sequence mytable_sequence 来自动增加你的纪录id号
二 源程序
<%String sConn="你的连接"
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection(sConn,"你的用户名","密码");
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
Statement stmtcount=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=stmt.executeQuery("select * from mytable_view");
String sqlcount="select count(*) from mytable_view";
ResultSet rscount=stmtcount.executeQuery(sqlcount);
int pageSize=你的每页显示纪录数;
int rowCount=0; //总的记录数
while (rscount
int pageCount; //总的页数
int currPage; //当前页数
String strPage;
strPage=request.getParameter("page");
if (strPage==null){
currPage=1;
}
else{
currPage=Integer.parseInt(strPage);
if (currPage<1) currPage=1;
}
pageCount=(rowCount+pageSize-1)/pageSize;
if (currPage>pageCount) currPage=pageCount;
int thepage=(currPage-1)*pageSize;
int n=0;
rs.absolute(thepage+1);
while (n<(pageSize)&&!rs
%>
<%rs.close();
rscount.close();
stmt.close();
stmtcount.close();
conn.close();
%>
//下面是 第几页等
<form name="sinfo" method="post" action="sbinfo_index.jsp?condition=<%=condition%>&type=<%=type%>" onSubmit="return testform(this)">
第<%=currPage%>页 共<%=pageCount%>页 共<%=rowCount%>条
<%if(currPage>1){%><a href="sbinfo_index.jsp?condition=<%=condition%>&type=& lt;%=type%>">首页</a><%}%>
<%if(currPage>1){%><a href="sbinfo_index.jsp?page=<%=currPage-1%>&condition=& lt;%=condition%>&type=<%=type%>">上一页</a><%}%& gt;
<%if(currPage<pageCount){%><a href="sbinfo_index.jsp?page=<%=currPage+1%>&condition=& lt;%=condition%>&type=<%=type%>">下一页</a><%}%& gt;
<%if(pageCount>1){%><a href="sbinfo_index.jsp?page=<%=pageCount%>&condition=& lt;%=condition%>&type=<%=type%>">尾页</a><%}%>
跳到<input type="text" name="page" size="4" style="font-size:9px">页
<input type="submit" name="submit" size="4" value="GO" style="font-size:9px">

</form>

********************JSP中表单数据存储的一种通用方法***********

摘 要
  本文以Oracle数据库为例,介绍了在采用JSP技术开发WEB应用时一种简便通用的表单数据存储处理方法,以减轻开发工作量,同时提供了主要的程序代码。
  引言
  J2EE(Java 2 Enterprise Edition)技术已广泛应用在Web应用开发中,其中的JavaBean、Servlet技术为开发者提供了更为清晰的开发环境,使用JSP技术表现 页面,使用Servlet技术完成大量的业务处理,使用Bean来存储数据及一些业务处理。在WEB应用中,业务数据存储到数据库中的处理工作经常很繁 重,其中一种主要的形式就是表单数据存储到数据库,整个应用处理过程牵涉到大量的这种数据存储操作,对每个表单都要单独编写相应的数据存储程序,花费了开 发人员大量的时间和精力。采用什么方法来减轻表单数据存储的开发工作量是值得研究的问题。
  两种常见的表单数据存储处理方法
  1、对每一表单都编写相应的程序代码
  在JSP页面或JavaBean或Servlet中,使用request. getparameter()函数逐一提取表单提交的数据,或编写相应的JavaBean,使用setProperty方法将数据自动取到 JavaBean中,然后生成SQL语句(insert,update,delete),最后执行executeupdate()函数完成数据表存储。
  2、对每一数据表自动生成一个JavaBean程序代码
  数据库系统必须支持用户能够读取表结构,并识别关键字段。利用面向对象快速开发工具,如PowerBuilder、Delphi等,自行开发 一个java代码自动生成程序。在该程序中读取数据库表的结构:字段名、数据类型、数据长度,自动生成一个JavaBean代码。在该代码中定义与表中字 段对应的同名变量,建立所有变量的setValue和getValue方法,建立insert、update、delete函数分别处理insert、 update、delete的SQL语句生成和执行。
  在表单提交的数据处理页面中,编写如下代码,将表单数据存储到JavaBean中:
<jsp:useBean id="table" class="table1_bean" />
<jsp:setProperty name="table" property="*" />
(注:table1_bean为上述自动生成的对应某一个表的JavaBean)
然后调用table1_bean中insert、update、delete函数完成数据表存储,并返回执行结果。如:
<%boolean success =table.insert(); %>
  第一种方法简单直观,但对每一表单都需要编写相应的数据处理程序。对稍微大一点的应用,表单数量可能很多,开发工作量很大,开发工作效率低。表结构变动如增加、减少字段时,需修改相应的数据处理程序。
  第二种方法相对第一种简便得多,每一数据表的数据处理由对应的JavaBean实现,JavaBean自动生成,不需编写,表结构变动时只需 重新生成新的JavaBean,经java编译后覆盖原java类即可。但该方法需要开发JavaBean自动生成程序,表结构变动时JavaBean需 要重新生成和编译。
  介绍一种简便通用的方法实现表单数据存储
  在WEB应用开发中,很多表单在经过前台浏览器端简单的数据校验后,提交后台服务器,服务器对数据不用作任何处理直接将数据存储到一个数据表 中。对这种情况,我们可以只编写一个程序,对这些表单统一处理,将数据存储到相应的一个数据表中。该方法同样要求数据库系统支持表结构读取和关键字段识 别。我们采用JSP技术编写该程序,程序文件取名为DbdataStore.jsp。
  1、调用格式
  在网页中表单的Action调用方法如下:
<Form Name=Frm1 Method=Post Action="DBdataStore.jsp? tablename=table1&OperType=…">
  table1为数据将要存储的数据库表的表名,OperType操作类型分为三种:insert,update,delete。
表单中的<input type=text name=…>,<textarea name=…><select name=…>等中的name值应与数据表的字段名相同,DBdataStore.jsp中逐一提取表单提交的对应字段名的数据值,若表单中未定义输入, 得到的值为空值,则对该字段不作处理。
  2、以oracle为例的视图定义
  1) 建立表各列数据类型视图
CREATE OR REPLACE VIEW v_dbstru AS SELECT table_name,column_name,data_type,data_length,data_precision,data_scale,column_id
FROM all_tab_columns WHERE owner="user1";//user1为数据表的属主。
  2) 建立表的关键列视图
CREATE OR REPLACE VIEW v_pkey_column AS
 SELECT b.table_name,b.column_name,b.position
 FROM all_constraints a,all_cons_columns b
 WHERE a.owner=b.owner AND a.constraint_name=b.constraint_name AND a.owner="user1"  AND a.constraint_type="P";
  3、主要程序代码
  1) 程序初始化
String tablename=request.getParameter("tablename");//提取表名
String OperType=request.getParameter("OperType");//提取操作类型
String sFieldValue="";//存放表单提交的字段数据值
String fieldname="",Datatype="" //存放字段名,字段数据类型
int iFieldvalue=0;
String updateSql="",whereSql=" where ",insSql1="",insSql2="",opSql="",strSql ="";
ResultSet rs1=null,rs2=null;
insSql1="insert into "+tablename+" (";
insSql2="values(";
  2)生成sql语句关键字段部分
  生成insert语句关键字段部分,如:insert into table1(id 和 values(100));
  只使用关键字段生成update,delete语句where部分,如:where id=100;
  在操作类型为update时,网页form表单中不对关键字段的数据进行修改。
rs1=Stmt.executeQuery("SELECT column_name FROM v_pkey_column WHERE table_name=""+tablename+""");//取关键字段字段名
while(rs1.next()){
 fieldname=rs1.getString("column_name");
 rs2=Stmt.executeQuery("SELECT data_type FROM v_dbstru WHERE  table_name=""+tablename+"" AND column_name=""+fieldname+""");//取关键字段数据类型
 if(rs2.next()){
  Datatype=rs2.getString("data_type");
  sFieldValue=request.getParameter(fieldname.toLowerCase());
  //生成insert语句关键字段部分
  if(OperType.equals("insert")){
   insSql1+=fieldname+",";
   if((sFieldValue==null) ){
    //表单未提交关键字段数据值时,本文只按数字型处理,数据值按下一流水号计算。
    rs2= Stmt. executeQuery("SELECT max("+fieldname+")+1 FROM "+tablename);rs2. next();iFieldvalue=rs2.getInt(1);insSql2+=Integer.toString(iFieldvalue)+",";      }else if(Datatype.equals("DATE")){
    insSql2+= "To_Date("" + sFieldValue + "","YYYY-MM-DD"),";
   }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
insSql2+=""" + sFieldValue+"",";}
   else /*NUMBER,FLOAT */ insSql2+=sFieldValue+",";}
   //生成update,delete语句where部分:where fieldname=... AND
   if(OperType.equals("update") || OperType.equals("delete")){
    if(Datatype.equals("DATE")){
     whereSql+=fieldname+"=To_Date("" + sFieldValue + "","YYYY-MM-DD") AND ";
    }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
     whereSql+=fieldname+"="" + sFieldValue+"" AND ";}
    else /*NUMBER,FLOAT */ whereSql+=fieldname+"="+ sFieldValue+" AND ";}
  }
 }
whereSql=whereSql.substring(0,whereSql.length()-4);
  3)非关键字段部分sql语句生成
  update语句,如:update table1 set column1=value1,… where id=100
  insert语句,如:insert into table1(id,column1,…)values(100,value1,…)
updateSql="update "+tablename+" set ";
strSql="SELECT column_name,data_type,data_length,data_precision,data_scale FROM  v_dbstru a "+"where table_name=""+tablename+"" AND a.column_name not in (SELECT    b.column_name FROM v_pkey_column b where b.table_name=a.table_name)";
rs1=Stmt.executeQuery(strSql);//取非关键字段字段名和数据类型
while(rs1.next()){
  fieldname=rs1.getString("column_name");Datatype=rs1.getString("data_type");    sFieldValue=request.getParameter(fieldname.toLowerCase());//若表单未提交该字段 的值,则忽略该字段的处理
 if((sFieldValue!=null)){
  //生成insert语句=insSql1+insSql2 即insert into tablename(… 和 values(…
  if(OperType.equals("insert")){ insSql1+=fieldname+",";
  if(Datatype.equals("DATE")){
   insSql2+= "To_Date("" + sFieldValue + "","YYYY-MM-DD"),";
  } else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
   insSql2+=""" + sFieldValue+"",";}else /*NUMBER,FLOAT*/ insSql2+= sFieldValue+",";}
  //生成update语句=updateSql+whereSql 即update tablename set ... where  fieldname=... if(OperType.equals("update")){
 if(Datatype.equals("DATE")){
  updateSql+=fieldname+"=To_Date("" + sFieldValue + "","YYYY-MM-DD"),";
 }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
  updateSql+=fieldname+"="" + sFieldValue,1}+"",";}else /*NUMBER,FLOAT*/ updateSql+=fieldname+"="+sFieldValue+",";} ))
 rs1.close();
  4)生成完整的sql语句并执行
if(OperType.equals("insert"))
 opSql=insSql1.substring(0,insSql1.length()-1)+")"+insSql2.substring(0,insSql2.length()-1)+")";
if(OperType.equals("update"))
 opSql=updateSql.substring(0,updateSql.length()-1)+" "+whereSql;if(OperType.equals("delete"))
 opSql="delete FROM "+tablename+" "+whereSql;
//已生成完整的sql语句opSql
try{sqlnrows=Stmt.executeUpdate(opSql);}
catch(SQLException e){out.println("SQLException:"+opSql);}
  4、特点
  该方法对所有这种直接存储的表单都统一使用本程序,具有通用性,不必对每个表单或每个数据表独立开发相应程序,开发工作量非常少,调用也非常 简便。同时,在表结构变动时,不用修改DBdataStore.jsp程序。本程序也可改写为Servelet,调用格式为<Form Name=Frm1 Method=Post Action="DBdataStoreServelet?tablename=table1&OperType=…">。
  结束语
  在Web应用中,如果表单数据在提交后,还需要服务器后台作进一步的数据校验或处理,则需要采用第二种方法。但很多情况是用户在表单中输入或 修改数据,在前台浏览器端使用javascript对数据进行简单校验或处理,然后提交,在后台服务器端不作任何处理,直接将表单提交的数据存储到数据库 的一个表中。这时候采用第三种方法非常简便,可以大大减轻开发人员的工作量

end

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics