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

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:Struts初級教程(1)-用戶登錄實(shí)例
      本教程從易用,實(shí)用的目的出發(fā),模擬完成實(shí)際開發(fā)中常用的模塊,讓大家能快速上手struts,下面我們正式開式吧。 Jsp的Struts是一個基于SunJ2EE平臺的MVC框架,主要是采用Servlet和JSP技術(shù)來實(shí)現(xiàn)的。 Struts把Servlet、JSP、自定義標(biāo)簽和信息資源(messagereso

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

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

          下面是效果圖:

             1、如圖鍵入:中文


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


        為什么會到錯誤頁面呢?我們明明都寫正確了呀,是的,沒有錯誤,這是什么原因呢?
      請看下圖:



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

      二、解決辦法:
      A、直接轉(zhuǎn)編碼
      我們新建一個包,命名為util,在包下新建一個類文件,命名為EncodingUtil,類的功能就是提供一個字符集轉(zhuǎn)換的一個方法,具體代碼如下所示:
      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)用這個方法,那程序又亂碼了,維護(hù)起來很困難,下面我們看另一種解決方案。

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

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

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

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

      具體代碼如下所示:
      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("請求被處理.");
                  } catch (UnsupportedEncodingException ex) {
              ex.printStackTrace();
          }
              return true;
           }
      }

      (3)    修改配置文件sturts-config.xml,在其中加入一個名為<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é):這樣做呢?問題是解決了,每一個請求先經(jīng)過這個方法,并轉(zhuǎn)換了字符集再交給action做處理,這樣我們不用在操心中文亂碼,但RequestProcessor是與struts耦合在一塊兒。如果不用struts框架,我們又該如何處理中文問題呢?是否又更好的辦法呢?那就接著跟我往下看吧。

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

      分享:詳解Jsp傳遞中文參數(shù)
      目前在jsp頁面中傳遞中文參數(shù),主要有兩種方式: URL方式,例如:http://website/test1.jsp?act=addtype=桔子param=%20D%20B FORM方式,例如: formname=testmehtod=post inputtype=hiddenname=text2value=中文 inputtype=textname=text1 inputtype=subm

      來源:模板無憂//所屬分類:JSP教程/更新時間:2010-03-23
      相關(guān)JSP教程