国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JSP > 正文

Struts初級(jí)教程(2)-避免出現(xiàn)亂碼

2024-09-05 00:17:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Jsp開(kāi)發(fā)中經(jīng)常出現(xiàn)中文亂碼問(wèn)題,所以必須提前處理。前面例子中,只要用戶名和密碼都是123,才返回成功的頁(yè)面。為了處理中文,我們?cè)O(shè)定判斷只有用戶名是張三才登陸成功。

既然是中文亂碼處理,頁(yè)面的用戶輸入就是中文了,相應(yīng)的action的if處理也要變成: if (username.equals("張三") && userpass.equals("123"));

    下面是效果圖:

       1、如圖鍵入:中文


顯示結(jié)果如下圖:


  為什么會(huì)到錯(cuò)誤頁(yè)面呢?我們明明都寫(xiě)正確了呀,是的,沒(méi)有錯(cuò)誤,這是什么原因呢?
請(qǐng)看下圖:



我們打印才發(fā)現(xiàn)原來(lái)username的值傳到action中,成了亂碼,這主要由于客戶端和服務(wù)器端采用了不同的字符集,中文亂碼我們沒(méi)有處理。

二、解決辦法:
A、直接轉(zhuǎn)編碼
我們新建一個(gè)包,命名為util,在包下新建一個(gè)類文件,命名為EncodingUtil,類的功能就是提供一個(gè)字符集轉(zhuǎn)換的一個(gè)方法,具體代碼如下所示:
package util;

public class Encoding {
    public static String isToGB(String src) {
        String strRet = null;
        try {
            strRet = new String(src.getBytes("ISO_8859_1"), "GBK");
        } catch (Exception e) {
            e.printStackTrace();
        }
            return strRet;
        }
}
小結(jié):這辦法雖然能解決中文亂碼,但是每次還得調(diào)用,是不是很不方便呢?如果忘記了調(diào)用這個(gè)方法,那程序又亂碼了,維護(hù)起來(lái)很困難,下面我們看另一種解決方案。

B、繼承RequestProcessor類
RequestProcessor類處理ActionServlet接收到的所有請(qǐng)求。根據(jù)它的處理方式,可將每個(gè)請(qǐng)求分解為多個(gè)小任務(wù),分別由不同的方法執(zhí)行。這就允許針對(duì)請(qǐng)求的各個(gè)單獨(dú)部分自定義處理。
RequestProcessor類的部分方法如下:
processPath():                   獲取客戶端請(qǐng)求的路徑URI
processMapping():             根據(jù)請(qǐng)求URI獲取所需的映射信息
processRoles():                 檢查用戶的角色是否允許他訪問(wèn)請(qǐng)求的資源
processActionForm():       新建一個(gè)Form Bean或從請(qǐng)求會(huì)話中檢索Form Bean
processForward():             處理<action-mapping>元素forward以匹配當(dāng)前的請(qǐng)求路徑
processValidate():               調(diào)用Form Bean的validate()方法
processPreprocess():        告訴請(qǐng)求處理器調(diào)用此方法后,是否應(yīng)繼續(xù)處理請(qǐng)求
processLocale():                為請(qǐng)求選擇一個(gè)語(yǔ)言環(huán)境
processActionCreate():              實(shí)例化當(dāng)前ActionMapping指定的類的實(shí)例
processActionPerform():    將調(diào)用action的perform()或execute()方法

呵呵,發(fā)沒(méi)發(fā)現(xiàn)RequestProcess類的所有方法都有一個(gè)前綴proess,接著往下看吧。

RequestProcessor在action之前,所以我們應(yīng)著手RequestProcessor,要開(kāi)發(fā)自己的RequestProcessor類,步驟如下:

(1)    創(chuàng)建一個(gè)繼承org.apache.struts.action.RequestProcessor的類,在改類中顯示定義一個(gè)無(wú)參,方法體為空的構(gòu)造器。
(2)    重寫(xiě)所需的方法,加入我們的功能。

具體代碼如下所示:
package servlets;

import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;

public class EncodingHandler extends RequestProcessor {
    public boolean processPreprocess(HttpServletRequest servletRequest,
                                                        HttpServletResponse serveltResponse)
 {
        try {
            servletRequest.setCharacterEncoding("GBK");
            System.out.println("請(qǐng)求被處理.");
            } catch (UnsupportedEncodingException ex) {
        ex.printStackTrace();
    }
        return true;
     }
}

(3)    修改配置文件sturts-config.xml,在其中加入一個(gè)名為<controller>的元素,用以指定我們定制的RequestProcessor類。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
 <form-beans>
    <form-bean name="loginActionForm" type="formbeans.LoginActionForm" />
 </form-beans>
 <action-mappings>
<action
path="/login"
name="loginActionForm"
scope="request"
type="actions.LoginAction">
      <forward name="success" path="/success.jsp"/>
      <forward name="error" path="/wrong.jsp"/>
    </action>
 </action-mappings>
 <controller processorClass="servlets.EncodingHandler" />
</struts-config>

上面就是我們自己的定義的RequestProcessor類,使用<controller>標(biāo)簽類定義。

小結(jié):這樣做呢?問(wèn)題是解決了,每一個(gè)請(qǐng)求先經(jīng)過(guò)這個(gè)方法,并轉(zhuǎn)換了字符集再交給action做處理,這樣我們不用在操心中文亂碼,但RequestProcessor是與struts耦合在一塊兒。如果不用struts框架,我們又該如何處理中文問(wèn)題呢?是否又更好的辦法呢?那就接著跟我往下看吧。

C、Filter來(lái)解決中文問(wèn)題
       Filter,是不是你腦子里閃現(xiàn)了這個(gè)詞呢?下面就來(lái)看看如何用它來(lái)改寫(xiě)我們上一章節(jié)的例子吧!
(1) 首先在工程中新建一包,命名為filter,在下面新建一類文件,命名為EncodingServlet,并繼承HttpServlet、實(shí)現(xiàn)Filter接口,注意并實(shí)現(xiàn)接口的方法。
在Servlet中filter起著過(guò)濾器的作用,當(dāng)一個(gè)請(qǐng)求發(fā)送到服務(wù)器的時(shí)候,需要把請(qǐng)求首先交給filter來(lái)處理,然后交給action做處理。EncodingServlet負(fù)責(zé)處理請(qǐng)求的字符集,在此就起這么個(gè)功能,具體代碼請(qǐng)依照如下所示:
package servlets;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

public class EncodingServlet extends HttpServlet implements Filter {

       private static final long serialVersionUID = 1L;
       public void doFilter(ServletRequest servletRequest,
          ServletResponse serveltResponse, FilterChain filterChain) {
              try {
                    servletRequest.setCharacterEncoding("GBK");
                    filterChain.doFilter(servletRequest, serveltResponse);
              } catch (Exception ex) {
              }
       }
       public void init(FilterConfig arg0) throws ServletException {
       }
}

(2)      修改web.xml,加入我們的filter。
<filter>
              <filter-name>EncodingServlet</filter-name>
              <filter-class>servlets.EncodingServlet</filter-class>
</filter>
<filter-mapping>
              <filter-name>EncodingServlet</filter-name>
              <url-pattern>/*</url-pattern>
</filter-mapping>
小結(jié):這個(gè)中文亂碼處理用了fileter,而且適用與任何場(chǎng)合,比較實(shí)用。
 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黑龙江省| 竹溪县| 孟连| 太仆寺旗| 多伦县| 潼关县| 朔州市| 昌乐县| 彭泽县| 万安县| 凤阳县| 西青区| 化州市| 突泉县| 淮阳县| 乌兰县| 平昌县| 周宁县| 平罗县| 伊金霍洛旗| 新乡县| 安国市| 义乌市| 罗定市| 榆中县| 肇东市| 株洲市| 潜江市| 乳山市| 宝兴县| 盈江县| 镇安县| 镇雄县| 南江县| 济阳县| 乾安县| 巴林左旗| 禄丰县| 藁城市| 洞头县| 郓城县|