字符編碼的處理和BeanUtils組件使用詳解_第1頁(yè)
字符編碼的處理和BeanUtils組件使用詳解_第2頁(yè)
字符編碼的處理和BeanUtils組件使用詳解_第3頁(yè)
字符編碼的處理和BeanUtils組件使用詳解_第4頁(yè)
字符編碼的處理和BeanUtils組件使用詳解_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第字符編碼的處理和BeanUtils組件使用詳解目錄1、字符編碼問(wèn)題解決方案1.1、字符編碼處理的實(shí)現(xiàn)2、字符和諧的問(wèn)題在過(guò)濾器中設(shè)置臟數(shù)據(jù)在處理完字符編碼問(wèn)題的時(shí)候進(jìn)行和諧(在處理完編碼之后進(jìn)行調(diào)用)3、BeanUtils組件的使用Beanutils組件是啥BeanUtils組件能干啥BeanUtils組件的使用使用BeanUtils組件的API4、Servlet請(qǐng)求參數(shù)的自動(dòng)封裝5、源數(shù)據(jù)使用5.1、數(shù)據(jù)庫(kù)的元數(shù)據(jù)的使用5.2、請(qǐng)求參數(shù)的元數(shù)據(jù)5.3、結(jié)果集元數(shù)據(jù)5.4、封裝一個(gè)通用的JDBC的增刪改的方法5.5、封裝一個(gè)根據(jù)條件查詢返回集合的方法

1、字符編碼問(wèn)題解決方案

原理:過(guò)濾器技術(shù)攔截所有的controll的請(qǐng)求、在controll請(qǐng)求中使用了動(dòng)態(tài)代理的設(shè)計(jì)模式監(jiān)聽(tīng)了HttpServletRequest這個(gè)接口中g(shù)etParameter方法的執(zhí)行、在getParameter執(zhí)行的時(shí)候、我們首先去獲取這個(gè)數(shù)據(jù)、再通過(guò)判斷當(dāng)前的請(qǐng)求是GET還是POST、如果是GET那么先使用IOS-8859-1進(jìn)行轉(zhuǎn)碼然后使用UTF-8從新進(jìn)行編碼、如果是POST那么直接使用request.setCharacterEncoding(UTF-8)來(lái)進(jìn)行處理

1.1、字符編碼處理的實(shí)現(xiàn)

publicclassCharacterFilterimplementsFilter{

@Override

publicvoidinit(FilterConfigarg0)throwsServletException{

*攔截的這個(gè)方法

@Override

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

finalFilterChainchain)throwsIOException,ServletException{

finalHttpServletRequestreq=(HttpServletRequest)request;

finalHttpServletResponseresp=(HttpServletResponse)response;

//第一步:將返回?cái)?shù)據(jù)的編碼問(wèn)題給處理了

resp.setContentType("text/html;charset=utf-8");

//POST的解決方案

req.setCharacterEncoding("UTF-8");

//第二步:監(jiān)聽(tīng)httpServletRequest中g(shù)etParameter方法的執(zhí)行

HttpServletRequestreq1=(HttpServletRequest)Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(),

newClass[]{HttpServletRequest.class},

newInvocationHandler(){

@Override

publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)

throwsThrowable{

//監(jiān)聽(tīng)當(dāng)前執(zhí)行的方法是不是getParameter

StringmethodName=method.getName();

if("getParameter".equals(methodName)){//說(shuō)明執(zhí)行的是getParameter

//判斷當(dāng)前執(zhí)行的是POST呢?還是GET呢

StringreqName=req.getMethod();

//通過(guò)key獲取這個(gè)值

Stringval=(String)method.invoke(req,args);

if("GET".equalsIgnoreCase(reqName)){//說(shuō)明是GET方法

//執(zhí)行這個(gè)方法獲取這個(gè)值

val=newString(val.getBytes("ISO-8859-1"),"UTF-8");

}elseif("POST".equalsIgnoreCase(reqName)){//說(shuō)明是POST方法

//返回這個(gè)方法執(zhí)行的結(jié)果

returnval;

}else{

returnmethod.invoke(req,args);

//最終要進(jìn)行放行

chain.doFilter(req1,resp);

@Override

publicvoiddestroy(){

2、字符和諧的問(wèn)題

明白一個(gè)問(wèn)題:什么是字符和諧:類似于博客網(wǎng)站上行比如你罵人了一句話這句話并不會(huì)直接顯示出來(lái)、而是顯示成****等這種現(xiàn)象就稱為字符的和諧

要實(shí)現(xiàn)字符和諧首先要解決編碼問(wèn)題(上面已經(jīng)解決了)

在過(guò)濾器中設(shè)置臟數(shù)據(jù)

//需要和諧的臟數(shù)據(jù)

privateString[]dirtyData={"MMD","NND","殺人","CTM"};

在處理完字符編碼問(wèn)題的時(shí)候進(jìn)行和諧(在處理完編碼之后進(jìn)行調(diào)用)

protectedStringhandleDirtyData(Stringval){

for(inti=0;idirtyData.length;i++){

if(val.contains(dirtyData[i])){

val=val.replaceAll(dirtyData[i],"***");

returnval;

3、BeanUtils組件的使用

Beanutils組件是啥

Beanutils不是一個(gè)框架、就相當(dāng)于是一個(gè)幫助類、這個(gè)幫助類的作用就是專門用來(lái)操作我們javaBean

BeanUtils組件能干啥

能夠?qū)⒁粋€(gè)實(shí)體的值賦值給另外一個(gè)實(shí)體、也可以將map類型的值賦值給實(shí)體、也可以將實(shí)體進(jìn)行拷貝

BeanUtils組件的使用

導(dǎo)入beanUtils的包

使用BeanUtils組件的API

publicvoidtestbeanUtils()throwsException{

Useruser=newUser(1,"小波波","123");

//使用BeanUtils來(lái)操作這個(gè)是實(shí)體

//API:表示的是給那個(gè)對(duì)象的那個(gè)屬性設(shè)置什么值

//BeanUtils.setProperty(user,"uName","小波波");

//BeanUtils.copyProperty(user,"uPwd","123");

//API:拷貝一個(gè)實(shí)體返回值就是copy生成的新的實(shí)體

//Useruser2=(User)BeanUtils.cloneBean(user);

Useruser2=newUser();

//把一個(gè)實(shí)體里面的屬性copy給另外一個(gè)實(shí)體的屬性

//BeanUtils.copyProperties(user2,user);

//將實(shí)體轉(zhuǎn)換成map

//MapObject,Objectmaps=BeanUtils.describe(user);

//獲取實(shí)體的屬性值并轉(zhuǎn)換成String類型的數(shù)組

//String[]strVal=BeanUtils.getArrayProperty(user,"uName");

//將Map中的數(shù)據(jù)直接賦值給JAVA的對(duì)象

MapString,Objectmaps=newHashMapString,Object

maps.put("uId",123);

maps.put("uName","小波波");

maps.put("uPwd","110");

//將map中的數(shù)據(jù)直接賦值給JAVA對(duì)象

BeanUtils.populate(user2,maps);

System.out.println(user2);

4、Servlet請(qǐng)求參數(shù)的自動(dòng)封裝

publicstaticTTgetObject(HttpServletRequestrequest,Classclazz)throwsException{

//反射得到這個(gè)數(shù)據(jù)類型

Tt=(T)clazz.newInstance();

//使用beanUtils組件來(lái)設(shè)置這個(gè)值

BeanUtils.populate(t,request.getParameterMap());

returnt;

5、源數(shù)據(jù)使用

源數(shù)據(jù)分類:數(shù)據(jù)庫(kù)的源數(shù)據(jù)、請(qǐng)求參數(shù)的元數(shù)據(jù)、結(jié)果集的元數(shù)據(jù)

數(shù)據(jù)庫(kù)的元數(shù)據(jù):能夠獲取當(dāng)前訪問(wèn)數(shù)據(jù)庫(kù)的一些信息(數(shù)據(jù)庫(kù)的名字、連接的URL、連接的用戶名、數(shù)據(jù)庫(kù)的版本信息)

請(qǐng)求參數(shù)的元數(shù)據(jù):能夠精確的知道當(dāng)前的SQL語(yǔ)句中有多少個(gè)占位符

結(jié)果集元數(shù)據(jù):就能清楚的知道當(dāng)前訪問(wèn)的這個(gè)數(shù)據(jù)庫(kù)的列名是什么

5.1、數(shù)據(jù)庫(kù)的元數(shù)據(jù)的使用

publicvoidtestDatabaseMetaData()throwsException{

//第一步:加載驅(qū)動(dòng)

Class.forName("com.mysql.jdbc.Driver");

//第二步:創(chuàng)建連接

Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);

//獲取數(shù)據(jù)庫(kù)的元數(shù)據(jù)

DatabaseMetaDatadata=conn.getMetaData();

//獲取數(shù)據(jù)庫(kù)的相關(guān)信息

System.out.println("數(shù)據(jù)庫(kù)的名字:"+data.getDatabaseProductName());

System.out.println("數(shù)據(jù)庫(kù)的版本:"+data.getDatabaseProductVersion());

System.out.println("數(shù)據(jù)庫(kù)的URL:"+data.getURL());

System.out.println("訪問(wèn)的用戶名:"+data.getUserName());

System.out.println("---------------------------------------");

//第三步:創(chuàng)建操作數(shù)據(jù)庫(kù)的對(duì)象

PreparedStatementstate=conn.prepareStatement("select*frommsgstateinfo");

//第四步:操作

ResultSetset=state.executeQuery();

//遍歷....

while(set.next()){

Stringstr=set.getString("msgstate");

System.out.println("獲取到的數(shù)據(jù)是:"+str);

conn.close();

5.2、請(qǐng)求參數(shù)的元數(shù)據(jù)

nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;publicvoidtestRequestParameMetaData()throwsException{

//第一步:加載驅(qū)動(dòng)

Class.forName("com.mysql.jdbc.Driver");

//第二步:創(chuàng)建連接

Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);

System.out.println("---------------------------------------");

//第三步:創(chuàng)建操作數(shù)據(jù)庫(kù)的對(duì)象

PreparedStatementstate=conn.prepareStatement("select*frommsgstateinfowhereidandmsgobj=andaa=");

//第四步:玩下請(qǐng)求參數(shù)的元數(shù)據(jù)

ParameterMetaDatadata=state.getParameterMetaData();

//現(xiàn)在你就可以知道當(dāng)前的SQL語(yǔ)句中有多少個(gè)占位符了

System.out.println("占位符的個(gè)數(shù):"+data.getParameterCount());

conn.close();

5.3、結(jié)果集元數(shù)據(jù)

publicvoidtestResultSetMetaData()throwsException{

//第一步:加載驅(qū)動(dòng)

Class.forName("com.mysql.jdbc.Driver");

//第二步:創(chuàng)建連接

Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);

System.out.println("---------------------------------------");

//第三步:創(chuàng)建操作數(shù)據(jù)庫(kù)的對(duì)象

PreparedStatementstate=conn.prepareStatement("select*fromt_user");

ResultSetset=state.executeQuery();

//下面就可以獲取結(jié)果集的元數(shù)據(jù)了

ResultSetMetaDataresultSetMetaData=set.getMetaData();

while(set.next()){//相當(dāng)于是遍歷的是行

//我們還可以遍歷列

intcolumnNum=resultSetMetaData.getColumnCount();

//通過(guò)列的下標(biāo)來(lái)知道列的名字

for(inti=0;icolumnNum;i++){

//通過(guò)列的下標(biāo)來(lái)找到列的名字

StringcolumnName=resultSetMetaData.getColumnName(i+1);

//知道了列的名字也就能找到這個(gè)列的值了

Objectval=set.getObject(columnName);

System.out.println(val);

conn.close();

5.4、封裝一個(gè)通用的JDBC的增刪改的方法

publicvoidupdate(Stringsql,Object...parames)throwsException{

//獲取連接

Connectionconn=getConnection();

//第二步:獲取操作數(shù)據(jù)庫(kù)的對(duì)象

PreparedStatementstate=conn.prepareStatement(sql);

//第三步:將傳遞過(guò)來(lái)的參數(shù)直接賦值給占位符

//獲取占位符的個(gè)數(shù)

ParameterMetaDataparameterMetaData=state.getParameterMetaData();

//獲取占位符的個(gè)數(shù)

intnum=parameterMetaData.getParameterCount();

if(parames.lengthnum){

thrownewRuntimeException("參數(shù)不對(duì)應(yīng)沒(méi)法玩....");

//說(shuō)明參數(shù)是對(duì)的

for(inti=0;inum;i++){

//設(shè)置參數(shù)了

state.setObject(i+1,parames[i]);

//執(zhí)行這個(gè)SQL語(yǔ)句

state.executeUpdate();

close();

5.5、封裝一個(gè)根據(jù)條件查詢返回集合的方法

publicTListTfindAll(Stringsql,ClassTclazz,Object...parames)throwsException{

//確定返回的這個(gè)容器

ListTlists=newArrayListT

//獲取連接

Connectionconn=getConnection();

//第二步:獲取操作數(shù)據(jù)庫(kù)的對(duì)象

PreparedStatementstate=conn.prepareStatement(sql);

//第三步:將傳遞過(guò)來(lái)的參數(shù)直接賦值給占位符

//獲取占位符的個(gè)數(shù)

ParameterMetaDataparameterMetaData=state.getParameterMetaData();

//獲取占位符的個(gè)數(shù)

intnum=parameterMetaData.getParameterCount()

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論