最近跟着作了個黑馬機構的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
問題二:post/get請求亂碼問題web
對於post請求:ajax
對於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啓動不起來:
<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相關:
小結: 因爲跟老師作過一些開發,總體上來講後臺功能實現起來並不難,而且感受視頻老師實現起來有那麼些隨意hhhhhh,前臺界面平時寫的太少,html+css+js學了忘,想本身調個啥樣式必須得上網查。。。 視頻老師開局就是幹編碼,直接導sql,導初始項目。本身整理了下需求提取出功能,在對他給的sql看了下,理解每一個字段的含義,看是如何表設計的。 整體來講:學習瞭如何一我的從0到1開幹作一個簡單的小項目。