文件的上傳
首先加入jar包(Fileupload)
在網頁中使用表單提交的時候,提交方式必須是post提交方式,編碼必須是multipart/form-data,還有就是要文件上傳的文本框,必須給它起名字,如圖所示:
其中划橫線的就是要注意的地方。
還需要在springmvc的配置文件中配置文件上傳解析器
<!-- 配置上傳文件解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 設置上傳文件的字節大小 --> <property name="maxUploadSize" value="9999999"></property> </bean>
其中bean標簽的id必須叫multipartResolver,不然程序會報錯誤。
在控制層controller里想要實現文件上傳的功能的說明;
@RequestMapping("upload") public String upload(MultipartFile myfile,HttpServletRequest request,Users user) { String path=request.getServletContext().getRealPath("/upload"); request.setAttribute("path", path); System.out.println(path); File file=new File(path); if(file.exists()) { file.mkdirs(); } String name=myfile.getOriginalFilename(); user.setPhoto(name); File targetfile=new File(path+"/"+name); try { FileUtils.writeByteArrayToFile(targetfile, myfile.getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } request.setAttribute("u", user); return "login"; }
在該方法的括號里得到文件的對象,String path=request.getServletContext().getRealPath("/upload");這句話是通過request得到上傳文件的真實路徑,也就是在服務器中的位置
File file=new File(path); if(!file.exists()) { file.mkdirs(); }
此代碼是獲取一個新的文件對象,如果沒有這個路徑,那么就重新創建一個新的路徑。有就正常執行下面的代碼。
String name=myfile.getOriginalFilename();獲取的是文件名
File targetfile=new File(path+"/"+name);是得到文件的整個路徑;
try { FileUtils.writeByteArrayToFile(targetfile, myfile.getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } request.setAttribute("u", user); return "login"; }
是為了把文件寫入到該路徑下。
攔截器
創建一個包存放Interceptor的這個類並且實現HandleInterceptor的接口這,然后重寫接口里面的方法
package HandleInterceptors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.zhiyou100.lw.bean.Users; public class MyInterceptors implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { if(request.getSession().getAttribute("u")==null) { response.sendRedirect("login.do"); return false; } return true; } }
這個方法是在控制層處理完之后執行的,最后執行,用於關閉一些資源的方法
這是這也是在控制層處理完后執行的
這個方法是在控制層處理前執行的,一般在這里執行攔截的功能,
把創建的類配置到springmvc文件中,如圖:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/user/**"/> <mvc:exclude-mapping path="/user/login.do"/> <mvc:exclude-mapping path="/user/logindo.do"/> <bean class="HandleInterceptors.MyInterceptors"></bean> </mvc:interceptor> </mvc:interceptors>
<mvc:mapping path="/user/**"/> 是把攔截的文件所有文件寫入到path中
<mvc:exclude-mapping path="/user/login.do"/> <mvc:exclude-mapping path="/user/logindo.do"/>它們都是被放行的文件,程序不攔截它們
和controller控制層的代碼配合實現了攔截功能。
數據校驗(后台)
第一步引入相關的jar包有:
校驗需要用到的jar包,缺一不可。
在實體類中加入注解
@NotEmpty(message=“用戶名不能為空”),這個是不能為空校驗的注解,message中的類容是提示內容,錯誤后提示
@Length(min=6,max=12,message=“密碼長度在6~12個字符之間”),這個是限制長度的注解,min是最少長度,max是最長長度
@Pattern(regexp=“。。。。。”)這個是對手機號碼的校驗。雙引號里面的是正則表達式
在控制層接收參數的代碼
在使用注解的實體類之前加上@Valid,代表的是對該對象進行校驗,BindingResult br,代表的是封裝所有的錯誤到這個對象里面
br.hasErrors,這個方法是判斷是否有錯誤信息的,有的話就進入里面,br。getFieldErrors,是獲得對象里面的所有信息,包括屬性名,和錯誤信息
如果想讓這些信息能夠在前端頁面上顯示出來,就得想一個方法,就是把它封裝到集合里面,頁面中就直接點鍵名就能調用此屬性名的錯誤信息了
就new一個map集合,for循環所有的錯誤信息,然后得到錯誤信息的屬性名,和錯誤信息的內容,將屬性名當做鍵,內容當做值,存入到map集合里,
最后把集合隨着跳轉就把數據傳送到頁面中去了
頁面接收顯示信息的代碼:
根據鍵值獲取對象。