最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

字符編碼的處理和BeanUtils組件使用詳解

 更新時間:2022年09月30日 08:42:25   作者:淺羽技術(shù)  
這篇文章主要為大家介紹了字符編碼的處理和BeanUtils組件的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

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

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

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

      public class CharacterFilter implements Filter{
@Override
public void init(FilterConfig arg0) throws ServletException {
}
    /**
     * 攔截的這個方法
     */
@Override
public void doFilter(ServletRequest request, ServletResponse response,
final FilterChain chain) throws IOException, ServletException {
    final HttpServletRequest req=(HttpServletRequest) request;
    final HttpServletResponse resp=(HttpServletResponse) response;
    //第一步:將返回數(shù)據(jù)的編碼問題給處理了
    resp.setContentType("text/html;charset=utf-8");
    //POST的解決方案
    req.setCharacterEncoding("UTF-8");
    //第二步:監(jiān)聽httpServletRequest中 getParameter方法的執(zhí)行
    HttpServletRequest req1= (HttpServletRequest) Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(),
     new Class[]{HttpServletRequest.class},
     new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
   //監(jiān)聽當前執(zhí)行的方法是不是 getParameter
   String methodName=method.getName();
   if("getParameter".equals(methodName)){ //說明執(zhí)行的是getParameter
  //判斷當前執(zhí)行的是POST呢?還是GET呢?
  String reqName=req.getMethod();
  //通過key獲取這個值
  String val= (String) method.invoke(req, args);
  if("GET".equalsIgnoreCase(reqName)){ //說明是GET方法
  //執(zhí)行這個方法獲取這個值
  val=new String(val.getBytes("ISO-8859-1"),"UTF-8");
  }else if("POST".equalsIgnoreCase(reqName)){ //說明是POST方法
  }
  //返回這個方法執(zhí)行的結(jié)果
  return val;
   }else{
  return  method.invoke(req, args);
   }
   }
});
   //最終要進行放行
   chain.doFilter(req1, resp);
}
@Override
public void destroy() {
}
}

2、字符和諧的問題

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

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

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

    //需要和諧的臟數(shù)據(jù)
private String[] dirtyData={"MMD","NND","殺人","CTM"};

在處理完字符編碼問題的時候進行和諧(在處理完編碼之后進行調(diào)用)

     protected String handleDirtyData(String val) {
for (int i = 0; i < dirtyData.length; i++) {
if(val.contains(dirtyData[i])){
val=val.replaceAll(dirtyData[i],"***");
}
}
return val;
}

3、BeanUtils組件的使用

Beanutils組件是啥?

 Beanutils不是一個框架、就相當于是一個幫助類、這個幫助類的作用就是專門用來操作我們java Bean

BeanUtils組件能干啥?

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

BeanUtils組件的使用?

導入beanUtils的包

使用BeanUtils組件的API

public void testbeanUtils() throws Exception {
User user=new User(1,"小波波","123");
//使用BeanUtils來操作這個是實體
//API:表示的是給那個對象的那個屬性設(shè)置什么值
//BeanUtils.setProperty(user,"uName","小波波");
//BeanUtils.copyProperty(user,"uPwd","123");
//API:拷貝一個實體 返回值就是copy生成的新的實體
//User user2=(User) BeanUtils.cloneBean(user);
User user2=new User();
//把一個實體里面的屬性copy給另外一個實體的屬性
//BeanUtils.copyProperties(user2, user);
//將實體轉(zhuǎn)換成map
//Map<Object,Object> maps=BeanUtils.describe(user);
//獲取實體的屬性值 并轉(zhuǎn)換成String類型的數(shù)組
//String[] strVal=BeanUtils.getArrayProperty(user,"uName");
//將Map中的數(shù)據(jù)直接賦值給JAVA的對象
Map<String,Object> maps=new HashMap<String, 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ù)的自動封裝

public static<T> T getObject(HttpServletRequest request,Class clazz) throws Exception{
//反射得到這個數(shù)據(jù)類型
T t=(T) clazz.newInstance();
//使用beanUtils組件來設(shè)置這個值
BeanUtils.populate(t,request.getParameterMap());
return t;
 }

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

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

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

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

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

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

     public void testDatabaseMetaData() throws Exception {
//第一步:加載驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
//第二步:創(chuàng)建連接
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
//獲取數(shù)據(jù)庫的元數(shù)據(jù)
DatabaseMetaData data=conn.getMetaData();
//獲取數(shù)據(jù)庫的相關(guān)信息
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ù)庫的對象
PreparedStatement state=conn.prepareStatement("select * from msgstateinfo");
//第四步:操作
ResultSet set=state.executeQuery();
//遍歷....
while (set.next()) {
String str=set.getString("msgstate");
System.out.println("獲取到的數(shù)據(jù)是:"+str);
}
conn.close();
}

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

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void testRequestParameMetaData() throws Exception {
//第一步:加載驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
//第二步:創(chuàng)建連接
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("---------------------------------------");
//第三步:創(chuàng)建操作數(shù)據(jù)庫的對象
PreparedStatement state=conn.prepareStatement("select * from msgstateinfo where id &lt; ? and msgobj = ? and aa=?");
//第四步:玩下請求參數(shù)的元數(shù)據(jù)
ParameterMetaData data=state.getParameterMetaData();
//現(xiàn)在你就可以知道當前的SQL語句中有多少個占位符了
System.out.println("占位符的個數(shù):"+data.getParameterCount());
conn.close();
}

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

    public void testResultSetMetaData() throws Exception {
//第一步:加載驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
//第二步:創(chuàng)建連接
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("---------------------------------------");
//第三步:創(chuàng)建操作數(shù)據(jù)庫的對象
PreparedStatement state=conn.prepareStatement("select * from t_user");
ResultSet set=state.executeQuery();
//下面就可以獲取結(jié)果集的元數(shù)據(jù)了
ResultSetMetaData resultSetMetaData=set.getMetaData();
while (set.next()) {   //相當于是遍歷的是行
//我們還可以遍歷列
int columnNum=resultSetMetaData.getColumnCount();
//通過列的下標來知道列的名字
for (int i = 0; i < columnNum; i++) {
//通過列的下標來找到列的名字
String columnName=resultSetMetaData.getColumnName(i+1);
//知道了列的名字也就能找到這個列的值了
Object val=set.getObject(columnName);
System.out.println(val);
}
}
conn.close();
} 

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

    public void update(String sql, Object... parames) throws Exception {
// 獲取連接
Connection conn = getConnection();
// 第二步:獲取操作數(shù)據(jù)庫的對象
PreparedStatement state = conn.prepareStatement(sql);
// 第三步:將傳遞過來的參數(shù)直接賦值給占位符
// 獲取占位符的個數(shù)
ParameterMetaData parameterMetaData = state.getParameterMetaData();
// 獲取占位符的個數(shù)
int num = parameterMetaData.getParameterCount();
if (parames.length < num) {
throw new RuntimeException("參數(shù)不對應(yīng)沒法玩....");
}
// 說明參數(shù)是對的
for (int i = 0; i < num; i++) {
// 設(shè)置參數(shù)了
state.setObject(i + 1, parames[i]);
}
// 執(zhí)行這個SQL語句
state.executeUpdate();
close();
}

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

public <T> List<T> findAll(String sql, Class<T> clazz,Object...parames) throws Exception {
//確定返回的這個容器
        List<T> lists=new ArrayList<T>();
// 獲取連接
Connection conn = getConnection();
// 第二步:獲取操作數(shù)據(jù)庫的對象
PreparedStatement state = conn.prepareStatement(sql);
// 第三步:將傳遞過來的參數(shù)直接賦值給占位符
// 獲取占位符的個數(shù)
ParameterMetaData parameterMetaData = state.getParameterMetaData();
// 獲取占位符的個數(shù)
int num = parameterMetaData.getParameterCount();
if (parames.length < num) {
throw new RuntimeException("參數(shù)不對應(yīng)沒法玩....");
}
//判斷:假設(shè)這個SQL語句根本就沒有占位符呢?
if(num!=0){   //說明有占位符
// 說明參數(shù)是對的
for (int i = 0; i < num; i++) {
// 設(shè)置參數(shù)了
state.setObject(i + 1, parames[i]);
}
}
// 執(zhí)行這個SQL語句
ResultSet set=state.executeQuery();
//下面移動游標遍歷這個行
//獲取這個列的數(shù)量
ResultSetMetaData metadata=set.getMetaData();
//可以獲取這個列的數(shù)量
int columnCount=metadata.getColumnCount();
while (set.next()) {
T t=clazz.newInstance();
//遍歷每一個列
for (int i = 0; i <columnCount; i++) {
//獲取每一個列的列名
String columnName=metadata.getColumnName(i+1);
//獲取這個列的值
Object columnVal= set.getObject(columnName);
//把上面的屬性和值 放到這個JAVA對象中去
BeanUtils.copyProperty(t, columnName, columnVal);
}
//將t放到List集合中去
lists.add(t);
}
close();
return lists;
}
``` 

以上就是字符編碼的處理和BeanUtils組件的使用的詳細內(nèi)容,更多關(guān)于字符編碼處理BeanUtils組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解SpringBoot 快速整合Mybatis(去XML化+注解進階)

    詳解SpringBoot 快速整合Mybatis(去XML化+注解進階)

    本篇文章主要介紹了詳解SpringBoot 快速整合Mybatis(去XML化+注解進階),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • SpringBoot實現(xiàn)在一個模塊中引入另一個模塊

    SpringBoot實現(xiàn)在一個模塊中引入另一個模塊

    這篇文章主要介紹了SpringBoot實現(xiàn)在一個模塊中引入另一個模塊的方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Java騷操作之CountDownLatch代碼詳解

    Java騷操作之CountDownLatch代碼詳解

    這篇文章主要介紹了Java騷操作之CountDownLatch代碼詳解,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • SpringBoot整合Quartz實現(xiàn)定時任務(wù)詳解

    SpringBoot整合Quartz實現(xiàn)定時任務(wù)詳解

    這篇文章主要介紹了Java?任務(wù)調(diào)度框架?Quartz,Quartz是OpenSymphony開源組織在Job?scheduling領(lǐng)域又一個開源項目,完全由Java開發(fā),可以用來執(zhí)行定時任務(wù),類似于java.util.Timer。,下面我們來學習一下關(guān)于?Quartz更多的詳細內(nèi)容,需要的朋友可以參考一下
    2022-08-08
  • Spring @Cacheable注解中key的使用詳解

    Spring @Cacheable注解中key的使用詳解

    這篇文章主要介紹了Spring @Cacheable注解中key的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java并發(fā)控制機制詳解

    Java并發(fā)控制機制詳解

    這篇文章主要為大家詳細介紹了Java并發(fā)控制機制,什么是Java并發(fā)控制機制,Java并發(fā)控制機制的作用,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java?webservice的POST和GET請求調(diào)用方式

    Java?webservice的POST和GET請求調(diào)用方式

    這篇文章主要介紹了Java?webservice的POST和GET請求調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 關(guān)于IDEA 2020.3 多窗口視圖丟失的問題

    關(guān)于IDEA 2020.3 多窗口視圖丟失的問題

    這篇文章主要介紹了關(guān)于IDEA 2020.3 多窗口視圖丟失的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 基于Javamail實現(xiàn)發(fā)送郵件(QQ/網(wǎng)易郵件服務(wù)器)

    基于Javamail實現(xiàn)發(fā)送郵件(QQ/網(wǎng)易郵件服務(wù)器)

    這篇文章主要介紹了基于Javamail實現(xiàn)發(fā)送郵件,分別使用QQ郵箱作為smtp郵件服務(wù)器發(fā)送郵件,使用網(wǎng)易郵箱作為smtp郵件服務(wù)器發(fā)送郵件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • springboot如何整合elasticsearch

    springboot如何整合elasticsearch

    這篇文章主要介紹了springboot如何整合elasticsearch問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論

中西区| 汉沽区| 南川市| 沧源| 九龙县| 抚宁县| 固安县| 仙居县| 桦川县| 延寿县| 崇义县| 江都市| 任丘市| 卓尼县| 汽车| 博客| 绵阳市| 阳谷县| 原平市| 乌兰浩特市| 合作市| 光山县| 香河县| 湘乡市| 嘉荫县| 靖边县| 亳州市| 军事| 峡江县| 平罗县| 汶上县| 南华县| 长汀县| 唐山市| 长沙市| 无为县| 罗甸县| 句容市| 鱼台县| 景洪市| 苗栗市|