黑馬旅遊網站筆記【JavaWeb】

最近跟着作了個黑馬機構的javaweb旅遊網站,在此記錄下實現過程當中的筆記:
項目視頻連接:www.bilibili.com/video/av680…css

總體技術選型:(mvc模式,但demo業務邏輯較簡單,我的將業務層放在web層中了)html

web層:前端

  • html+ajax:視圖層
  • Servlet+Filter:前端控制器/過濾器
  • BeanUtils:實體數據封裝
  • jackSon:json序列化工具
  • javaMail:郵件發送工具
  • redis+jedis:nosql型數據庫

DAO層:mysql5+druid鏈接池+JdbcTemplatejava

問題一:maven亂碼問題
整個項目基於maven構建:控制檯亂碼、後臺接收中文參數亂碼。網上的資料比較多,解決方式我都有所嘗試,最後這樣解決:
mysql

如今還有點疑惑爲什麼將其設定爲GB2312就能夠?maven不是藉助tomcat進行部署的嗎,tomcat7及其如下它默認的編碼是ISO8859-1。爲什麼我設定的GBK或者UTF-8無效,只有GB2312解決了個人問題??

問題二:post/get請求亂碼問題web

  • 原由:使用ajax發送get請求時servlet接收帶中文參數亂碼了。解決辦法以下:


對於post請求:ajax

  • request.setCharacterEncoding("utf-8")


對於get請求:redis

  • 修改tomcat自身的配置文件:在conf/server.xml中將sql

    <Connector connectionTimeout="50000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    複製代碼

    修改成 <Connector connectionTimeout="50000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>chrome

  • 程序進行處理,例如:

    String name = request.getParameter("name");
        name = new String(name.getBytes("iso-8859-1"),"utf-8");
    
    複製代碼
  • 統一解決方式:使用Javaweb中的過濾器Filter,採用裝飾者模式進行編碼統一解決post/get請求亂碼問題。

/** * 採用裝飾者模式對request進行加強,解決全站亂碼問題,處理全部post/get請求 */
@WebFilter("/*")
public class CharacterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse rep, FilterChain filterChain) throws IOException, ServletException {
        //將父接口轉爲子接口
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) rep;
        MyRequest myRequest = new MyRequest(request);
        //處理響應亂碼
        response.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(myRequest, response);//此處傳入加強後的request對象
    }

    @Override
    public void destroy() {

    }

    /* 對request對象進行加強 重寫getParameter與getParameterValues方法 */
    class MyRequest extends HttpServletRequestWrapper {

        HttpServletRequest request = null;

        public MyRequest(HttpServletRequest request) {
            super(request);
            this.request = request;
        }

        //加強getParameter方法
        @Override
        public String getParameter(String name) {

            String method = request.getMethod();
            String value = null;
            try {
                request.setCharacterEncoding("utf-8");
                value = request.getParameter(name);
                if ("get".equalsIgnoreCase(method)) {
                    value = new String(value.getBytes("iso-8859-1"), "utf-8");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return value;
        }

        //加強getParameterValues方法
        @Override
        public String[] getParameterValues(String name) {

            String method = request.getMethod();
            String[] values = null;
            try {
                request.setCharacterEncoding("utf-8");
                values = request.getParameterValues(name);
                if ("get".equalsIgnoreCase(method)) {
                    int i = 0;
                    for (String str : values) {
                        values[i++] = new String(str.getBytes("iso-8859-1"), "utf-8");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return values;
        }
    }

}

複製代碼


試着將註冊頁面的請求改成GET請求,執行完畢去數據庫一看,納尼,仍是亂碼???一頓debug發現沒問題呀,獲取到的是中文,後來發現用的獲取數據是request.getParameterMap與BeanUtils進行封裝的,我沒加強getParameterMap方法。

問題三:html之間參數傳遞及其亂碼問題
關於js的三種編碼解碼方式:www.haorooms.com/post/js_esc…

//方式一:好比獲取http://.....?rname=張三
    var search = location.search;
    var rname = search.split("=")[1]; // 切割字符串,拿到第二個值
   //方式二:
   var cid = getParameter("rname");
   function getParameter(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
    var r = location.search.substr(1).match(reg);
    if (r != null) return (r[2]);
    return null;
    //解碼
    if (rname!=null) {
        //url解碼
        rname = window.decodeURIComponent(rname);
    }
 }
複製代碼

問題四:maven用tomcat7:run啓動不起來:

  • 原由:以前點錯了在原項目中新建了一個moudle,刪除moudle後運行tomcat7:run啓動不起來也不報任何錯誤信息,連target目錄都未生成。
  • 緣由:以前新建一個Moudle後系統自動將個人pom.xml進行了修改。[一個小時才找出來,新手上路....]
  • 解決辦法: 將<packing>pom</packing>改爲<packing>war</packing>便可
    <groupId>zcc</groupId>
    <artifactId>travel</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    複製代碼

PS:打包類型有三種:jar、pom、war 若是是本身須要運行的項目則將其打包爲war包便可。

問題五:瀏覽器緩存問題
時不時有遇到修改js界面的=沒得反應,屢次刷新也無果,crtl+shift+delete清空瀏覽器緩存便可.
chrome取消瀏覽器緩存:在調試面板選擇network選擇Disable cache便可.

js相關:

  • prop(),attr()設置對象屬性:能用prop()就用prop() juejin.im/post/5d6e6a…
  • 修改js後刷新瀏覽器無反應:瀏覽器緩存所至,可清空瀏覽器緩存。可手動關閉瀏覽器緩存功能。

  • location對象是window對象的一個部分,包含有關當前URL的信息
    location.href():設置或返回完整的url
    location.search():設置或返回從?開始的URL部分
    location.reload():刷新當前頁面

小結: 因爲跟老師作過一些開發,總體上來講後臺功能實現起來並不難,而且感受視頻老師實現起來有那麼些隨意hhhhhh,前臺界面平時寫的太少,html+css+js學了忘,想本身調個啥樣式必須得上網查。。。 視頻老師開局就是幹編碼,直接導sql,導初始項目。本身整理了下需求提取出功能,在對他給的sql看了下,理解每一個字段的含義,看是如何表設計的。 整體來講:學習瞭如何一我的從0到1開幹作一個簡單的小項目。

相關文章
相關標籤/搜索