jsp日記系統

jsp日記系統中的知識點
在jsp中取項目路徑:

${pageContext.request.contextPath}

1.本地表單驗證 加onsubmit 提交表單之前做驗證 return true 則提交 return false 不提交;

<form name="myForm" class="form-signin" action="login" method="post" onsubmit="return checkForm()">

2.使用Properties 類 寫數據庫的參數配置
使用

		Properties prop = new Properties();
		InputStream in = new PropertiesUtil().getClass().getResourceAsStream("/diary.properties");
		prop.load(in);
		return (String)prop.getProperty(key);

3.MD5加密

	MessageDigest md5 = MessageDigest.getInstance("md5");
	BASE64Encoder base64en = new BASE64Encoder();//base64編碼格式
	return base64en.encode(md5.digest(str.getBytes("utf-8")));

4.設置用戶cookie
實現記住密碼和用戶

	public void rememberMe(String userName,String password,HttpServletResponse response){
	Cookie user = new Cookie("user", userName+"-"+password);
	user.setMaxAge(1*60*60*24*7);//設置存活時間爲7天
	response.addCookie(user);//通過response對象 返回給view層
	
}
前臺獲取cookie
if(request.getAttribute("user") == null){
	String userName = null;
	String password = null;
	Cookie[] cookies = request.getCookies();
	for(int i=0;cookies!=null && i<cookies.length;i++){
		if(cookies[i].getName().equals("user")){
			userName = cookies[i].getValue().split("-")[0];
			password = cookies[i].getValue().split("-")[1];
		}
		
	}
	
	if(userName == null){
		userName = "";
	}
	
	if(password == null){
		password = "";
	}
	
	pageContext.setAttribute("user", new User(userName,password));
	
}

5.寫前臺頁面
佈局採用bootstrap 的流式佈局

<div class="container">//容器
	<div class="row-fluid">//一行
		<div class="span9">//9列
			<div class="span3">//3列

解決圖片文字不居中

.data_list .data_list_title img{
	vertical-align: top;
}

6.用戶請求過濾器Filter
創建HttpFilter 類 重寫 doFilter方法
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {

	HttpSession session = request.getSession();
	Object obj = session.getAttribute("currentUser");
	String path = request.getServletPath();
	System.out.println(path);
	if(obj == null && path.indexOf("login")<0 && path.indexOf("bootstrap")<0 && path.indexOf("images")<0){
		response.sendRedirect("login.jsp");
		
	}else{
		chain.doFilter(request, response);
	}
}

**request.getServletPath();**獲取請求路徑
str.indexOf(“字符串”) 返回指定字符串在當前字符串中的位置,未找到返回-1 找到
path.indexOf(“login”)<0 作用是設置過濾條件 當請求路徑包含"login"時候放行,

配置web.xml文件 映射Filter 類

	 <filter>
  	<filter-name>loginFilter</filter-name>
  	<filter-class>com.java1234.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>loginFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

7.日記列表顯示

編寫Diarydao的方法;

	public List<Diary> diaryList(Connection con)throws Exception{
	List<Diary> diaryList = new ArrayList<>();
	StringBuffer sb = new StringBuffer("select * from t_diary t1,t_diaryType t2 where t1.typeId = t2.diaryTypeId");
	sb.append( " order by t1.releaseDate desc");
	PreparedStatement pstmt = con.prepareStatement(sb.toString());
	ResultSet rs = pstmt.executeQuery();
	
	while(rs.next()){
		Diary diary = new Diary();
		diary.setDiaryId(rs.getInt("diaryId"));
		diary.setTitle(rs.getString("title"));
		diary.setContent(rs.getString("content"));
		diary.setReleaseDate(DateUtil.formatString(rs.getString("releaseDate"), "yyyy-MM-dd HH:mm:ss"));
		
		diaryList.add(diary);
		
	}
	
	return diaryList;
}

查詢Diary 表 返回集合List List知識詳解參考簡書文章

解決string 和Date 格式化問題

data 工具類格式化日期
將Date類型轉化爲字符串 使用 SimpleDateFormat類的 format()方法 傳入指定格式的字符串即可 常見格式(“yyyy-MM-dd h: m:s”)
將字符串轉爲Date類型 使用SimpleDateFormat類的prase()方法 傳入指定格式的字符串即可 常見格式(“yyyy-MM-dd h: m:s”)

public class StringUtil {
//字符串工具類
public static boolean isEmpty(String str){
	if("".equals(str)|| str==null){
		return true;
	}else{
		return false;
	}
}

public static boolean isNotEmpty(String str){
	if(!"".equals(str)&&str!=null){
		return true;
	}else{
		return false;
	}
}
}



public class DateUtil {
//data 工具類格式化日期
public static String formatDate(Date date,String format){
	String result="";
	SimpleDateFormat sdf=new SimpleDateFormat(format);
	if(date!=null){
		result=sdf.format(date);
	}
	return result;
}


public static Date formatString(String str,String format) throws Exception{
	if(StringUtil.isEmpty(str)){
		return null;
	}
	SimpleDateFormat sdf=new SimpleDateFormat(format);
	return sdf.parse(str);
}

view層顯示使用c標籤遍歷diaryList 並使用fmt標籤格式化顯示日期

<div class="diary_datas">
			<ul>
					<c:forEach items="${diaryList}" var="diary" >
					<li>【<fmt:formatDate value="${diary.releaseDate}" type="date"  pattern="yyyy-MM-dd"/>】<span>&nbsp;&nbsp;<a href="#">${diary.title }</a></span></li>
					</c:forEach>
			</ul>

css樣式處理中的一些常用的屬性

list-style-type: none;去除ul標籤中的小點點
text-align: center;文本居中

8.分頁
實現分頁需要知道幾個數據
1.當前頁 page
2.每頁的記錄數 pageSize
3.起始頁 start
創建pageBean
在查詢Diary方法上添加參數pageBean

獲取起始頁的 算法 (page-1)*pageSize
在service 層創建一個pageBean 傳入page(當前頁)和pageSize(每頁記錄數)
在dao層根據pageBean的參數進行查詢限制
設置sql語句限制查詢的記錄數使用limit起始記錄,每頁記錄數

" limit "+pageBean.getStart()+","+pageBean.getPageSize()

在service層添加獲取總記錄數的方法getdiaryCount()
設計生成分頁代碼的方法genPageAction()傳入總頁數,當前頁 ,每頁記錄數
分頁中固定的兩個位置爲首頁和尾頁

	<li><a href='main?page=1'>首頁</a></li>
	<li><a href='main?page="+totalPage+"'>尾頁</a></li>

上一頁的限制條件:
噹噹前頁=1的時候上一頁則不能被點擊
噹噹前頁!=1的時候上一頁能被點擊且 href中傳入的page爲當前頁-1
具體實現:

if(currentPage==1){
		pageCode.append("<li class='disabled'><a hred='#'>上一頁</a></li>");

	}else{
		pageCode.append("<li><a href='main?page="+(currentPage-1)+"'>上一頁</a></li>");

	}

下一頁與之相同
噹噹前頁=總頁數的時候 下一頁不能被點擊
噹噹前頁!=總頁數的時候 下一頁能被點擊且 href中傳入的page爲當前頁+1
具體實現:

	if(currentPage==totalPage){
		pageCode.append("<li class='disabled'><a hred='#'>下一頁</a></li>");

	}else{
		pageCode.append("<li><a href='main?page="+(currentPage+1)+"'>下一頁</a></li>");

	}

中間顯示分頁 使用for循環 設置對應的分頁數
爲什麼要-2: 讓當前頁左邊顯示的分頁數到當前頁-2 處開始
爲什麼要+2:讓當前頁右邊顯示的分頁數到當前頁+2處結束
如當前頁爲6則顯示爲
4,5當前頁(6),7,8
限制條件爲 當i<1時或者i>總頁數時 跳過 不執行添加操作
原因:當i<1時 並沒有一個頁面是負數的
當i>總頁面數時 數據庫並沒有這麼多數據 給你顯示

並且設置當前頁爲被選中狀態

	for(int i=currentPage-2;i<=currentPage+2;i++){
		if(i<1||i>totalPage){
			continue;
		}
		if(i==currentPage){
			pageCode.append("<li class='active'><a href='#'>"+i+"</a></li>");
		}else{
			pageCode.append("<li><a href='main?page="+i+"'>"+i+"</a></li>");
		}
	}

如 數據庫有count =40 條記錄
每頁顯示記錄數5條
當前爲第2頁
則40/5 = 8 頁 整除情況
若每頁記錄數爲6
則40/6 = 6餘4 應該在頁面顯示7頁才能完整顯示 所以 算法爲
count%pageSize==o?count/pageSize:count/pageSize+1

9.日誌歸類 按類別
創建DiaryTypeBean

需要查詢出日誌類別表的所有數據所以需要使用到左/右連接查詢
關鍵字 表1right join 表2 on 條件

sql :SELECT diaryTypeId,typeName,COUNT(diaryId) FROM t_diary RIGHT JOIN t_diaryType ON t_diary.typeId=t_diaryType.diaryTypeId GROUP BY typeName;

將查詢到的結果存在Session 中

//View層通過<c:forEach >遍歷出所有數據存顯示

				<ul>
					<c:forEach var="diaryType" items="${diaryTypeCountList}">
					<li><span><a href="#">${diaryType.typeName}(${diaryType.diaryCount })</a></span></li>
					</c:forEach>
				</ul>

按日期

數據庫 sql

SELECT	DATE_FORMAT(releaseDate,'%Y年%m月'),COUNT(*) AS diaryCount FROM  t_diary GROUP BY DATE_FORMAT(releaseDate,'%Y年%m月')ORDER BY releaseDate DESC;

使用DATE_FORMAT(DATE,‘FORMAT’)對日期進行格式化
使用ORDER BY * DESC 進行排序

在DiaryBean 中添加 格式化後的日期屬性 releaseDatestr 和 diaryCount 記錄總數屬性

在DiaryDao中編寫 diaryCount() 獲取根據日期並排序的記錄

	public List<Diary> diaryCountList(Connection con) throws Exception{
	List<Diary> diaryList = new ArrayList<>();
	String sql = "SELECT DATE_FORMAT(releaseDate,'%Y年%m月') as releaseDatestr,COUNT(*) AS diaryCount FROM  t_diary GROUP BY DATE_FORMAT(releaseDate,'%Y年%m月')ORDER BY releaseDate DESC;";
	PreparedStatement pstmt = con.prepareStatement(sql);
	ResultSet rs = pstmt.executeQuery();
	
	while(rs.next()){
		Diary diary = new Diary();
		diary.setReleaseDatestr(rs.getString("releaseDatestr"));
		diary.setDiaryCount(rs.getInt("diaryCount"));
		
		diaryList.add(diary);
		
	}
	return diaryList;
}

在service層調用獲取值後 同過session 保存

session.setAttribute("diaryCountList", diaryDao.diaryCountList(con));

view 層 通過<c:forEach>遍歷出數據

<div class="datas">
	<ul>
			<c:forEach var="diaryCount" items="${diaryCountList}">
				<li>
					<span><a href="#">${diaryCount.releaseDatestr}(${diaryCount.diaryCount })</a></span>
				</li>
				</c:forEach>
		</ul>
</div>

9.個人中心實現
功能1.顯示用戶圖片 暱稱 和 心情
在userDao中 獲取數據庫的以上數據 轉發到前臺 前臺通過request獲取
功能2.實現點擊日誌分類 後顯示對應的日誌信息
實現點擊日期分類後顯示對應的日誌信息

實現:1.在顯示日誌分類的標籤屬性href上 添加請求 請求中包含要請求的日誌類型id

<a href="main?s_typeId=${diaryType.diaryTypeId}">

在servlet中獲取到請求的類型id
在查詢所有日誌數據dao中 添加日誌類型id的限制條件 在diaryList()方法中添加一個diary參數

diaryList(Connection con,PageBean pageBean,Diary s_diary )

判斷diary中diaryTypeId是否爲空
若不爲空 則添加查詢限制條件 限制返回的數據

if(s_diary.getTypeId()!=-1){
		sb.append(" and t1.typeId="+s_diary.getTypeId());
	}

對於還要實現分頁 所以必須限制查詢到的所有記錄數
在diaryCount()方法中添加diary參數

diaryCount(Connection con,Diary s_diary) 

在分頁時限制查到的數據
判斷diary中diaryTypeId是否爲空

if(s_diary.getTypeId()!=-1){
		sb.append(" and t1.typeId="+s_diary.getTypeId());
	}

若不爲空 則添加查詢限制條件 限制查詢到的記錄條數

在servlet處理中
判斷當diaryTypeId 不爲空時
根據從前臺獲取到的diaryTypeId 添加到Diary 對象中
並把diaryTypeId 的值存放到session中
並把獲取到的日期session的值刪除 實現當點擊按類型分類查詢時,按日期分類查詢不衝突
session.removeAttribute(“str”)刪除指定的session
if(StringUtil.isNotEmpty(s_typeId)){
diary.setTypeId(Integer.parseInt(s_typeId));
session.setAttribute(“s_typeId”, s_typeId);
session.removeAttribute(“s_releaseDatestr”);
}

當diaryTypeId 爲空時就去session中查詢 是否有diaryTypeId 的值
如果查詢不爲空值 則將diaryTypeId 添加到Diary 對象中
這樣做的目的是當你在前臺點擊了按類型分類的日誌時 當點對應的分頁時查詢到的內容還是爲該類型的數據而不是其他或者查到空數據

	if(StringUtil.isEmpty(s_typeId)){
		Object o = session.getAttribute("s_typeId");
		if(o != null){
			diary.setTypeId(Integer.parseInt((String)o));
		}
	}

然後去調用查詢所有數據
調用分頁
調用轉發到前臺頁面

按日期顯示數據與上面一樣
首先 在前臺顯示頁面中 在日期類型列表的href中添加對應的請求日期releaseDatestr

<a href="main?s_releaseDatestr=${diaryCount.releaseDatestr }

在查詢所有DiaryList()方法中添加判斷。若Diary對象中的releaseDatestr的這個屬性值不爲空則在sql後面追加限制條件

if(StringUtil.isNotEmpty(s_diary.getReleaseDatestr())){
		sb.append(" and DATE_FORMAT(t1.releaseDate,'%Y年%m月')='"+s_diary.getReleaseDatestr()+"'");
	}

其中使用到了格式化日期 DATE_FORMAT()方法
返回限制查詢後的所有數據
在分頁中也添加對應限制條件 限制返回到 的所有數據條數

在servlet中通過request獲取到前臺傳入的releaseDatestr值,
判斷若不爲空 並將其設置到Diary 對象中 並刪除根據類型查詢時設置的Session中的值
讓當查詢所有數據時 限制條件只有一個 這樣就不好衝突
在這裏如果前臺傳過來的releaseDatestr值有亂碼則使用
String 類的編碼格式化 new String(s_releaseDatestr.getBytes(“ISO-8859-1”),“UTF-8”);

if(StringUtil.isNotEmpty(s_releaseDatestr)){
			 //s_releaseDatestr = new String(s_releaseDatestr.getBytes("ISO-8859-1"),"UTF-8");
			diary.setReleaseDatestr(s_releaseDatestr);
			session.setAttribute("s_releaseDatestr", s_releaseDatestr);
			session.removeAttribute("s_typeId");
		}

繼續添加當releaseDatestr爲空時點擊分頁不會出現查詢數據爲查詢全部數據

if(StringUtil.isEmpty(s_releaseDatestr)){
			Object o = session.getAttribute("s_releaseDatestr");
			if(o != null){
				diary.setReleaseDatestr((String)o);
			}
		}

然後去調用查詢所有數據
調用分頁
調用轉發到前臺頁面

10.實現搜索查詢指定數據

在前臺頁面設置一個查詢的表單 設置請求的路徑爲main?all=true;
並設置一個輸入框 ,設置一個name 屬性 在servlet中獲取到 all 的值 和name 的值
判斷是否爲空
不爲空時將要查詢的title 設置在Diary對象中 並將其值設置到session中
將其他限制條件的Session 中的值移除
當爲空時在session中查找是否有title屬性的值 如果title不爲空,則將title設置到Diary對象中
這樣做的是當點擊下一頁時 也是查詢的當前指定內容的記錄

if("true".equals(all)){
		if(StringUtil.isNotEmpty(s_title)){
			diary.setTitle(s_title);
		}
		session.removeAttribute("s_releaseDatestr");
		session.removeAttribute("s_typeId");
		session.setAttribute("s_title", s_title);
	}

在其他查詢條件中添加移除session中title屬性的值

if(StringUtil.isNotEmpty(s_typeId)){
			diary.setTypeId(Integer.parseInt(s_typeId));
			session.setAttribute("s_typeId", s_typeId);
			session.removeAttribute("s_releaseDatestr");
			session.removeAttribute("s_title");
		}

在DiaryList中和DiaryCount (分頁時查詢指定條件的所有記錄條數)添加 限制條件 爲title 爲模糊查詢的條件

if(StringUtil.isNotEmpty(s_diary.getTitle())){
		sb.append(" and t1.title like '%"+s_diary.getTitle()+"%'");
	}

然後去調用查詢所有數據
調用分頁
調用轉發到前臺頁面

11.日誌顯示
實現顯示指定日誌詳情,在日誌列表中的title 的href中加上指向具體的typeId參數和添加處理類型的屬性action=show,
新建一個diarydao的新方法 DiaryShow 返回值爲 Diary 類型 其中要返回的內容要包括
標題 發佈日期 發佈類型 具體內容
新建一個 servlet 用於處理各種Diary 的處理請求 根據傳過來的參數 分配不同的方法處理 相當於一箇中控 模板開發
在這個中控 的servlet中編寫一個用於顯示Diary的私有方法 然後將Diarydao中返回的數據使用request.attrbute()轉發到前臺顯示

		request.setAttribute("diary",diary);
		request.setAttribute("mainPage", "diary/diaryShow.jsp");
		request.getRequestDispatcher("mainTemp.jsp").forward(request, response);

新建一個showDiary.jsp 用於顯示具體信息
轉發過程爲先請求到mainTemp模板頁面,模板頁通過jsp:inculd 將顯示具體內容也面內容包括進模板頁 然後渲染模板頁裏的Css和js 最終顯示給用戶

11.日誌信息的添加
在這裏將保存和修改操作存放在一個jsp中,通過傳遞的參數不同區分操作爲添加Diary還是修改Diary,
在Diarydao中創建一個用於處理添加日記的addDiary的方法,通過前臺頁面表單傳傳入一個Diary類型的數據,添加成功後跳轉到首頁顯示最新記錄,添加失敗將錯誤信息和Diary存放在request中轉發到diarySave.jsp 顯示

在這裏用到了CKeditor 在線文本編輯插件

CKeditor 用法
1.引入

2.創建一個編輯器實例
在textere標籤中引入CKeditor

表單驗證
創建一個function checkForm 在表單 上添加一個οnsubmit="return checkForm()"提交的時候驗證 返回flase則不提交
驗證表單是否有內容,沒有內容則提示添加
js中獲取 CKeditor 中的內容使用

var content=CKEDITOR.instances.content.getData();

checkform如下

function checkForm(){
var title=document.getElementById("title").value;
var content=CKEDITOR.instances.content.getData();
var typeId=document.getElementById("typeId").value;
if(title==null||title==""){
	document.getElementById("error").innerHTML="標題不能爲空!";
	return false;
}
if(content==null||content==""){
	document.getElementById("error").innerHTML="內容不能爲空!";
	return false;
}
if(typeId==null||typeId==""){
	document.getElementById("error").innerHTML="請選擇日誌類別!";
	return false;
}
return true;

}

12.日誌信息的修改
在Diarydao 中添加修改diary 的update方法 update t_diary set *=?..
在前臺頁面顯示時根據請求的diaryId參數 是否爲空在servlet中 選擇 預處理顯示爲寫日誌還是修改日誌,如果爲修改操作 則還需在數據庫中獲取該日誌的信息 並通過request.setattribute 設置值 並轉發到修改頁面

修改頁面其實與添加日誌的界面是一致的 只需要根據 diayId 是否爲空切換一下 顯示的標題頭 在這裏通過<c:chooes>標籤 和<c:when><c:otherwise>標籤選擇即可
在內容框中通過jstl表達式獲取數據庫的內容並顯示,
在這裏 日誌類型是用下拉框顯示的在這裏需要對下拉框進行判斷 提高用戶體驗 顯示當前diary對應的日誌類型 使用三目表達式即可

<option value="${diaryTypeCount.diaryTypeId }" ${diaryTypeCount.diaryTypeId==diary.typeId ?'selected':'' } >${diaryTypeCount.typeName}</option>

13.日誌分類管理

  1. 首先是需要顯示全部的分類信息到頁面上所以編寫用於查詢所有分類信息的dao
    diaryTypeList 在這裏 返回類型爲diaryType類型的List

  2. 編寫用於處理的Servlet方法在這裏需要針對前臺頁面提交的請求地址的不同編寫不同的方法處理。在這裏痛過請求/diaryType?action=preSave 中action的值的不同進行處理。在Servlet對應的處理方法中首先調用dao層查詢出全部的diaryType信息,然後通過request.setAttribute 吧查詢到的list給轉發到前臺頁面 ,

  3. 編寫用於顯示的diaryTypeshow.jsp顯示全部信息,在這裏將全部信息放置在一個table表格中 並設置 修改和刪除的操作, 通過<c:forEach>標籤進行遍歷顯示全部信息
    4.實現修改和添加diaryType的typeName ,首先編寫dao層的方法updateDiaryType修改name字段的值通過diaryTypeId
    和添加一個diaryType 根據typeName 的值

     String sql = "insert into t_diaryType values(null,?)";
    
     String sql = "update t_diaryType set typeName=? where diaryTypeId=?";
    

前臺頁面請求修改diaryType的地址是

onclick="javascript:window.location='diaryType?action=preSave&diaryTypeId=${diaryType.diaryTypeId}'"

前臺頁面請求添加diaryType的地址是

onclick="javascript:window.location='diaryType?action=preSave'"

爲了複用在Servlet中創建一個preSave方法通過根據diaryTypeId的值是否爲空去判斷是添加操作還是修改操作,如果是添加操作則直接轉發到顯示頁面 讓用戶輸入要添加的name,如果是修改操作,則還需要查詢數據庫 ,將要修改的數據放在request中轉發到前臺顯示,

在修改或者添加完過後請求保存地址爲action=Save 子在這裏也通過根據diaryTypeId的值是否爲空調用添加或者修改的方法
如果成功調用則顯示到主頁列表

	request.getRequestDispatcher("diaryType?action=list").forward(request, response);

如果調用失敗則將失敗信息顯示在顯示頁面

request.setAttribute("error", "添加或保存失敗");
request.setAttribute("mainPage", "diaryTypePreSave");
request.getRequestDispatcher("mainTemp.jsp").forward(request, response);

14.個人信息
顯示個人信息 ,需要獲取在登錄時設置在Session中的User的全部信息 然後編寫用於處理User信息的Servlet ,這這個Servlet中創建一個用於顯示User的方法用於轉發到前臺頁面
編寫前臺頁面userShow.jsp頁面獲取轉發的信息,並顯示,在userShow.jsp中包含的信息有:一個頭像框,一個文件上傳組件,和一個關於User信息的input框和textarea
在Dao層中編寫用於修改的userUpdate ,在userShow.jsp中 給表單提交添加表單驗證和提交地址提交地址爲user?action=save,請求到Servlet層後根據action的參數不同使用Save方法進行處理,首先獲取表單中的所有信息,上傳的文件處理見下面的 上傳圖片 在Save方法中使用Dao中的userUpdate 進行處理
處理完畢後根據userUpdate返回的結果轉發到顯示頁面 還是通過request.getRequestDispatcher 的方法轉發到主頁

15.上傳圖片

在表單中需要添加屬性 enctype=“multipart/form-data” 才能上傳文件

在servlet處理中,需要 通過HttpServletRequest對象獲取RequestContext對象
才能使用文件上傳 HttpservletRequset不行 必須通過new ServletRequestContext(request)獲取RequestContext對象。

解決方法:

上傳文件時獲取文件FileItem,通過new ServletRequestContext(request)獲取RequestContext對象。
List items = upload.parseRequest(new ServletRequestContext(request));

//上傳文件需要用到
		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		List<FileItem> items=null;
		try {
			items=upload.parseRequest(new ServletRequestContext(request));
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		Iterator<FileItem> itr = items.iterator();
		boolean imageChange = false;
		HttpSession session = request.getSession();
		User user = (User)session.getAttribute("currentUser");
		while(itr.hasNext()){
			FileItem item = itr.next();
		
		if(item.isFormField()){//獲取普通表單
			String fieldName = item.getFieldName();//獲取字段名稱
			if("nickName".equals(fieldName)){
				user.setNickName(item.getString("UTF-8"));
			}
			if("mood".equals(fieldName)){
				user.setMood(item.getString("UTF-8"));
			}
			
		}else if(!"".equals(item.getName())){//用於上傳文件用的獲取表單信息
				try {
					imageChange = true;
					String imageName = DateUtil.getCurrentDateStr();//獲取用於生成文件名的方法
					user.setImageName(imageName+"."+item.getName().split("\\.")[1]);
					String filePath = PropertiesUtil.getValue("imagePath")+imageName+"."+item.getName().split("\\.")[1];
					item.write(new File(filePath));//寫出文件
				} catch (Exception e) {
					e.printStackTrace();
				}
				
		}
		
	}

eclipse生成war包,部署在tomcat上,報錯404

解決上傳圖片 後必須要刷新項目才能刷新出新的圖片

將上傳圖片的路徑不放在項目路徑中,放在D盤其他位置 通過添加tomcat server.xml 的映射路徑 增加一個用於訪問外部路徑的請求 如下

1。解決方案,配置tomcat的server.xml在host節點下配置:

在上傳文件時 上傳到 docBase 對應的路徑

imagePath=D:\\uploadImage\                  \Properties配置文件中 設置文件存放路徑

String filePath = PropertiesUtil.getValue("imagePath")+imageName+"."+item.getName().split("\\.")[1];
item.write(new File(filePath));//寫出文件

前端頁面顯示時在src中添加請求路徑 src="/upload${currentUser.imageName} "

最重要 要重啓eclipse 才能生效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章