




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 法學(xué)概論考試常見(jiàn)試題及答案攻略
- 網(wǎng)絡(luò)管理員考試各類問(wèn)題試題及答案
- 法學(xué)概論考試的創(chuàng)新與突破及試題及答案
- 2025年VB中的項(xiàng)目實(shí)施與管理考察題及答案
- 網(wǎng)絡(luò)安全中的社會(huì)工程學(xué)考核試題及答案
- 項(xiàng)目管理的關(guān)鍵要素試題及答案
- 行政管理重要參考試題及答案
- 2025年軟件工程基礎(chǔ)試題及答案
- 老年病科工作總結(jié)與未來(lái)規(guī)劃計(jì)劃
- 兒科病房護(hù)士工作計(jì)劃
- 液化石油氣充裝操作規(guī)程
- 研究生高分論文寫作(上篇)
- 工學(xué)一體化教學(xué)參考工具體例格式9:學(xué)習(xí)任務(wù)工作頁(yè)
- 抖音短視頻帳號(hào)策劃運(yùn)營(yíng)表
- 南昌大學(xué)理工科類實(shí)驗(yàn)(尖子班)選拔考試
- 現(xiàn)澆混凝土箱梁專項(xiàng)施工方案
- 國(guó)產(chǎn)數(shù)據(jù)庫(kù)發(fā)展研究報(bào)告
- 教師專業(yè)發(fā)展第9章-教師個(gè)人自傳課件
- 企業(yè)主要負(fù)責(zé)人履行安全生產(chǎn)職責(zé)專項(xiàng)檢查表
- 國(guó)家電網(wǎng)招聘之管理類通關(guān)題庫(kù)帶答案
- 農(nóng)業(yè)氣象學(xué)(山東聯(lián)盟-青島農(nóng)業(yè)大學(xué))知到章節(jié)答案智慧樹(shù)2023年
評(píng)論
0/150
提交評(píng)論