




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第字符編碼的處理和BeanUtils組件使用詳解目錄1、字符編碼問題解決方案1.1、字符編碼處理的實現2、字符和諧的問題在過濾器中設置臟數據在處理完字符編碼問題的時候進行和諧(在處理完編碼之后進行調用)3、BeanUtils組件的使用Beanutils組件是啥BeanUtils組件能干啥BeanUtils組件的使用使用BeanUtils組件的API4、Servlet請求參數的自動封裝5、源數據使用5.1、數據庫的元數據的使用5.2、請求參數的元數據5.3、結果集元數據5.4、封裝一個通用的JDBC的增刪改的方法5.5、封裝一個根據條件查詢返回集合的方法
1、字符編碼問題解決方案
原理:過濾器技術攔截所有的controll的請求、在controll請求中使用了動態代理的設計模式監聽了HttpServletRequest這個接口中getParameter方法的執行、在getParameter執行的時候、我們首先去獲取這個數據、再通過判斷當前的請求是GET還是POST、如果是GET那么先使用IOS-8859-1進行轉碼然后使用UTF-8從新進行編碼、如果是POST那么直接使用request.setCharacterEncoding(UTF-8)來進行處理
1.1、字符編碼處理的實現
publicclassCharacterFilterimplementsFilter{
@Override
publicvoidinit(FilterConfigarg0)throwsServletException{
*攔截的這個方法
@Override
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
finalFilterChainchain)throwsIOException,ServletException{
finalHttpServletRequestreq=(HttpServletRequest)request;
finalHttpServletResponseresp=(HttpServletResponse)response;
//第一步:將返回數據的編碼問題給處理了
resp.setContentType("text/html;charset=utf-8");
//POST的解決方案
req.setCharacterEncoding("UTF-8");
//第二步:監聽httpServletRequest中getParameter方法的執行
HttpServletRequestreq1=(HttpServletRequest)Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(),
newClass[]{HttpServletRequest.class},
newInvocationHandler(){
@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
//監聽當前執行的方法是不是getParameter
StringmethodName=method.getName();
if("getParameter".equals(methodName)){//說明執行的是getParameter
//判斷當前執行的是POST呢?還是GET呢
StringreqName=req.getMethod();
//通過key獲取這個值
Stringval=(String)method.invoke(req,args);
if("GET".equalsIgnoreCase(reqName)){//說明是GET方法
//執行這個方法獲取這個值
val=newString(val.getBytes("ISO-8859-1"),"UTF-8");
}elseif("POST".equalsIgnoreCase(reqName)){//說明是POST方法
//返回這個方法執行的結果
returnval;
}else{
returnmethod.invoke(req,args);
//最終要進行放行
chain.doFilter(req1,resp);
@Override
publicvoiddestroy(){
2、字符和諧的問題
明白一個問題:什么是字符和諧:類似于博客網站上行比如你罵人了一句話這句話并不會直接顯示出來、而是顯示成****等這種現象就稱為字符的和諧
要實現字符和諧首先要解決編碼問題(上面已經解決了)
在過濾器中設置臟數據
//需要和諧的臟數據
privateString[]dirtyData={"MMD","NND","殺人","CTM"};
在處理完字符編碼問題的時候進行和諧(在處理完編碼之后進行調用)
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組件能干啥
能夠將一個實體的值賦值給另外一個實體、也可以將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);
//將實體轉換成map
//MapObject,Objectmaps=BeanUtils.describe(user);
//獲取實體的屬性值并轉換成String類型的數組
//String[]strVal=BeanUtils.getArrayProperty(user,"uName");
//將Map中的數據直接賦值給JAVA的對象
MapString,Objectmaps=newHashMapString,Object
maps.put("uId",123);
maps.put("uName","小波波");
maps.put("uPwd","110");
//將map中的數據直接賦值給JAVA對象
BeanUtils.populate(user2,maps);
System.out.println(user2);
4、Servlet請求參數的自動封裝
publicstaticTTgetObject(HttpServletRequestrequest,Classclazz)throwsException{
//反射得到這個數據類型
Tt=(T)clazz.newInstance();
//使用beanUtils組件來設置這個值
BeanUtils.populate(t,request.getParameterMap());
returnt;
5、源數據使用
源數據分類:數據庫的源數據、請求參數的元數據、結果集的元數據
數據庫的元數據:能夠獲取當前訪問數據庫的一些信息(數據庫的名字、連接的URL、連接的用戶名、數據庫的版本信息)
請求參數的元數據:能夠精確的知道當前的SQL語句中有多少個占位符
結果集元數據:就能清楚的知道當前訪問的這個數據庫的列名是什么
5.1、數據庫的元數據的使用
publicvoidtestDatabaseMetaData()throwsException{
//第一步:加載驅動
Class.forName("com.mysql.jdbc.Driver");
//第二步:創建連接
Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);
//獲取數據庫的元數據
DatabaseMetaDatadata=conn.getMetaData();
//獲取數據庫的相關信息
System.out.println("數據庫的名字:"+data.getDatabaseProductName());
System.out.println("數據庫的版本:"+data.getDatabaseProductVersion());
System.out.println("數據庫的URL:"+data.getURL());
System.out.println("訪問的用戶名:"+data.getUserName());
System.out.println("---------------------------------------");
//第三步:創建操作數據庫的對象
PreparedStatementstate=conn.prepareStatement("select*frommsgstateinfo");
//第四步:操作
ResultSetset=state.executeQuery();
//遍歷....
while(set.next()){
Stringstr=set.getString("msgstate");
System.out.println("獲取到的數據是:"+str);
conn.close();
5.2、請求參數的元數據
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;publicvoidtestRequestParameMetaData()throwsException{
//第一步:加載驅動
Class.forName("com.mysql.jdbc.Driver");
//第二步:創建連接
Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);
System.out.println("---------------------------------------");
//第三步:創建操作數據庫的對象
PreparedStatementstate=conn.prepareStatement("select*frommsgstateinfowhereidandmsgobj=andaa=");
//第四步:玩下請求參數的元數據
ParameterMetaDatadata=state.getParameterMetaData();
//現在你就可以知道當前的SQL語句中有多少個占位符了
System.out.println("占位符的個數:"+data.getParameterCount());
conn.close();
5.3、結果集元數據
publicvoidtestResultSetMetaData()throwsException{
//第一步:加載驅動
Class.forName("com.mysql.jdbc.Driver");
//第二步:創建連接
Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);
System.out.println("---------------------------------------");
//第三步:創建操作數據庫的對象
PreparedStatementstate=conn.prepareStatement("select*fromt_user");
ResultSetset=state.executeQuery();
//下面就可以獲取結果集的元數據了
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();
//第二步:獲取操作數據庫的對象
PreparedStatementstate=conn.prepareStatement(sql);
//第三步:將傳遞過來的參數直接賦值給占位符
//獲取占位符的個數
ParameterMetaDataparameterMetaData=state.getParameterMetaData();
//獲取占位符的個數
intnum=parameterMetaData.getParameterCount();
if(parames.lengthnum){
thrownewRuntimeException("參數不對應沒法玩....");
//說明參數是對的
for(inti=0;inum;i++){
//設置參數了
state.setObject(i+1,parames[i]);
//執行這個SQL語句
state.executeUpdate();
close();
5.5、封裝一個根據條件查詢返回集合的方法
publicTListTfindAll(Stringsql,ClassTclazz,Object...parames)throwsException{
//確定返回的這個容器
ListTlists=newArrayListT
//獲取連接
Connectionconn=getConnection();
//第二步:獲取操作數據庫的對象
PreparedStatementstate=conn.prepareStatement(sql);
//第三步:將傳遞過來的參數直接賦值給占位符
//獲取占位符的個數
ParameterMetaDataparameterMetaData=state.getParameterMetaData();
//獲取占位符的個數
intnum=parameterMetaData.getParameterCount()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國CDMA無線接入平臺數據監測報告
- 2025年中國3,5-雙三氟甲基苯胺數據監測報告
- 2025至2030年中國非金屬工藝品激光雕刻切割機市場分析及競爭策略研究報告
- 2025至2030年中國鋁輪帽市場分析及競爭策略研究報告
- 2025至2030年中國連續鍛造加熱爐市場分析及競爭策略研究報告
- 2025至2030年中國草莓果苗市場分析及競爭策略研究報告
- 2025至2030年中國維綸子口布市場分析及競爭策略研究報告
- 2025至2030年中國電動車組裝線市場分析及競爭策略研究報告
- 2025至2030年中國灌裝機回氣針市場分析及競爭策略研究報告
- 2025至2030年中國汽車吊液壓零部件市場分析及競爭策略研究報告
- 醫療質量活動月活動方案
- 2025至2030中國汽車售后服務行業市場現狀分析及競爭格局與投資發展報告
- 廣東省梅州市五華縣2024-2025學年七年級下學期數學期末考試模擬卷(含答案)
- 警察政治培訓課件
- 毒蛇咬傷的急救處理要點
- 2025年山西萬家寨水務控股集團所屬企業招聘筆試參考題庫含答案解析
- 2025至2030中國工業軟件行業項目調研及市場前景預測評估報告
- 2025年中國舒適眼鏡白皮書-艾瑞咨詢-202506
- 配電故障緊急搶修
- (2025)發展對象培訓考試題和答案
- 2025年經濟學基礎理論考試試卷及答案
評論
0/150
提交評論