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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

1、字符編碼問題解決方案

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

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

publicclassCharacterFilterimplementsFilter{

@Override

publicvoidinit(FilterConfigarg0)throwsServletException{

*攔截的這個方法

@Override

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

finalFilterChainchain)throwsIOException,ServletException{

finalHttpServletRequestreq=(HttpServletRequest)request;

finalHttpServletResponseresp=(HttpServletResponse)response;

//第一步:將返回數(shù)據(jù)的編碼問題給處理了

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

//POST的解決方案

req.setCharacterEncoding("UTF-8");

//第二步:監(jiān)聽httpServletRequest中getParameter方法的執(zhí)行

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

newClass[]{HttpServletRequest.class},

newInvocationHandler(){

@Override

publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)

throwsThrowable{

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

StringmethodName=method.getName();

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

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

StringreqName=req.getMethod();

//通過key獲取這個值

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

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

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

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

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

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

returnval;

}else{

returnmethod.invoke(req,args);

//最終要進行放行

chain.doFilter(req1,resp);

@Override

publicvoiddestroy(){

2、字符和諧的問題

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

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

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

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

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

在處理完字符編碼問題的時候進行和諧(在處理完編碼之后進行調(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不是一個框架、就相當于是一個幫助類、這個幫助類的作用就是專門用來操作我們javaBean

BeanUtils組件能干啥

能夠?qū)⒁粋€實體的值賦值給另外一個實體、也可以將map類型的值賦值給實體、也可以將實體進行拷貝

BeanUtils組件的使用

導入beanUtils的包

使用BeanUtils組件的API

publicvoidtestbeanUtils()throwsException{

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

//使用BeanUtils來操作這個是實體

//API:表示的是給那個對象的那個屬性設置什么值

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

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

//API:拷貝一個實體返回值就是copy生成的新的實體

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

Useruser2=newUser();

//把一個實體里面的屬性copy給另外一個實體的屬性

//BeanUtils.copyProperties(user2,user);

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

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

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

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

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

MapString,Objectmaps=newHashMapString,Object

maps.put("uId",123);

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

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

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

BeanUtils.populate(user2,maps);

System.out.println(user2);

4、Servlet請求參數(shù)的自動封裝

publicstaticTTgetObject(HttpServletRequestrequest,Classclazz)throwsException{

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

Tt=(T)clazz.newInstance();

//使用beanUtils組件來設置這個值

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

returnt;

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

源數(shù)據(jù)分類:數(shù)據(jù)庫的源數(shù)據(jù)、請求參數(shù)的元數(shù)據(jù)、結果集的元數(shù)據(jù)

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

請求參數(shù)的元數(shù)據(jù):能夠精確的知道當前的SQL語句中有多少個占位符

結果集元數(shù)據(jù):就能清楚的知道當前訪問的這個數(shù)據(jù)庫的列名是什么

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

publicvoidtestDatabaseMetaData()throwsException{

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

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

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

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

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

DatabaseMetaDatadata=conn.getMetaData();

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

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

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

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

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

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

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

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、請求參數(shù)的元數(shù)據(jù)

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

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

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

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

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

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

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

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

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

ParameterMetaDatadata=state.getParameterMetaData();

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

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

conn.close();

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

publicvoidtestResultSetMetaData()throwsException{

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

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

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

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

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

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

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

ResultSetset=state.executeQuery();

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

ResultSetMetaDataresultSetMetaData=set.getMetaData();

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

//我們還可以遍歷列

intcolumnNum=resultSetMetaData.getColumnCount();

//通過列的下標來知道列的名字

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

//通過列的下標來找到列的名字

StringcolumnName=resultSetMetaData.getColumnName(i+1);

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

Objectval=set.getObject(columnName);

System.out.println(val);

conn.close();

5.4、封裝一個通用的JDBC的增刪改的方法

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

//獲取連接

Connectionconn=getConnection();

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

PreparedStatementstate=conn.prepareStatement(sql);

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

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

ParameterMetaDataparameterMetaData=state.getParameterMetaData();

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

intnum=parameterMetaData.getParameterCount();

if(parames.lengthnum){

thrownewRuntimeException("參數(shù)不對應沒法玩....");

//說明參數(shù)是對的

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

//設置參數(shù)了

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

//執(zhí)行這個SQL語句

state.executeUpdate();

close();

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

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

//確定返回的這個容器

ListTlists=newArrayListT

//獲取連接

Connectionconn=getConnection();

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

PreparedStatementstate=conn.prepareStatement(sql);

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

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

ParameterMetaDataparameterMetaData=state.getParameterMetaData();

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

intnum=parameterMetaData.getParameterCount()

溫馨提示

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

評論

0/150

提交評論