javaspring框架,SpringMVC 的總結

 2023-09-30 阅读 24 评论 0

摘要:一:EasyMVC 1.MVC思想 三層架構:WEB開發的最佳實踐就是根據功能職責的不同,劃分為控制層,業務層,持久層.![這里寫圖片描述](https://img-blog.csdn.net/20180413203038991?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/font

一:EasyMVC

1.MVC思想

三層架構:WEB開發的最佳實踐就是根據功能職責的不同,劃分為控制層,業務層,持久層.![這里寫圖片描述](https://img-blog.csdn.net/20180413203038991?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

MVC原理

MVC模型:是一種架構型的模型,本身不引入新功能,只是幫助我們將開發的結構組織的更加合理,使顯示與模型分離,流程控制邏輯,業務邏輯調用與展示邏輯分離----->責任分離Model(模型):數據模型,包含要展示的數據與業務功能.(Service,domain)View(視圖):用戶界面,在用戶界面上顯示模型數據Controller(控制器):起調作用,接受用戶請求,調用業務處理請求,共享模型數據并跳轉界面.![MVC圖片說明](https://img-blog.csdn.net/20180414183004539?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)MVC框架需要哪些功能:設置請求編碼,接受請求參數,輸入校驗參數類型轉換,把參數封裝到對象中,設置共享數據,文件上傳,文件下載,控制界面跳轉,國際化處理,自定義標簽.

2.前端控制器

什么是前端控制器:Front Controller模式要求在WEB應用系統的前端(Front)設置一個入口控制器(Controller),是用來提供一個集中的請求處理機制,所有的請求都被發往該控制器統一處理,然后把請求分發給各自的處理程序.一般用來做一個共同的處理,如權限檢查,授權,日志記錄等.因為前端控制的集中處理請求的能力,因此提高了可重用性和可拓展性.![前端控制器的作用](https://img-blog.csdn.net/20180414184718822?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

javaspring框架。二:走進SpringMVC

1.SpringWeb框架:

什么是SpringMVC?mvc框架,它解決WEB開發中常見的問題(參數接收,文件上傳,表單驗證,國際化,等等),而且使用簡單,與Spring無縫集成,Spring3.0后全面超越Strus2,成為最優秀的MVC框架(更安全,性能更好,更簡單)支持RESTful風格的URL請求,非常容易與其他視圖技術集成,如Velocity,FreeMarker.采用了松散耦合可插拔組件結構,比其他MVC框架更具擴展性和靈活性.

SpringMVC和Struts2對比

:SpringMVC的前端控制器是Servlet,而Struts2Filter.②:SpringMVC會稍微比Struts2快些,SpringMVC是基于方法設計,處理器是單例,而Struts2是基于類沒發一次請求都會實例一個新的Action對象,Action是多例的.③:SpringMVC更加簡潔,開發效率SpringMVCStruts2高,如支持JSR303校驗,且處理AJAX請求更方便.④:Struts2OGNL表達式使頁面的開發效率相比SpringMVC更高些,但是SpringMVC也不難差.

2.入門程序

準備環境:搭建web項目,拷貝依賴的jar開發步驟::配置前端控制器:DispatcherServlet:配置處理器映射器:BeanNameUrlHandlerMapping:配置處理器適配器:SimpleControllerHandlerAdapter:配置視圖解析器:InternalResourceViewResolver:開發和配置處理器:HelloController![helloword開發步驟](https://img-blog.csdn.net/20180414200641953?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
<!-- 配置前端控制器 --><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:mvc.xml</param-value></init-param><!-- 在Tomcat啟動的時候就就初始化SpringMVC容器 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern>        </servlet-mapping>
<!-- 1:處理器映射器 --><!-- 目的:選擇哪一個處理器(controller)來處理當前請求BeanNameUrlHandlerMapping會按照處理器的id/name作為URL去查找/hello  去匹配id或name為/hello的bean--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!-- 2:處理器適配器 --><!-- 目的:調用處理器(Controller)的處理請求的方法1:所有的適配器都實現HandlerAdapter接口2:處理器(Controller)類必須實現org.springframework.web.servlet.mvc.Controller--><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/><!-- 3:視圖解析器 --><!-- 處理視圖 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/><!-- 4:處理器 在SpringMVC中Handler(框架)和Controller(自己)是同一個東西.--><bean id="/hello" class="cn.wolfcode.hello.HelloController"/><bean id="/hello2" class="cn.wolfcode.hello.HelloController2"/>

3.執行流程

    ![執行流程示意圖,返回處理器中含有攔截器Filter](https://img-blog.csdn.net/20180414210440182?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

spring mvc 注解、4.使用注解開發

Spring版型注解JavaEE應用三層架構:控制層(mvc)           @Controller業務邏輯層(Service)   @Service數據持久層(DAO)       @Resposotory其他組件使用通用注解   @Component
mvc.xml中的注解<!--在哪個包中掃描注解--><context:component-scan base-package="cn.wolfcode"/><!--MVC注解解析器--><mvc:annotation-driven/>它很強大:會自動去注冊RequestHandlerMapping,RequestMappingHandlerAdapter,ExeceptionHandlerExceptionResolver三個bean除此之外,SpringMVC中幾乎沒有注解,都需要改注解解析器來解析.支持類型轉換ConversionService@NumberFormat,DateTimeFormate注解@Validdate JSR303校驗.@RequestBody @ResponseBody等等.
其實不管用注解還是xml都可以不配置這三個,因為在springmvc包中有缺省的配置信息:<!-- 1:處理器映射器 --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!-- 2:處理器適配器 --><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/><!-- 3:視圖解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>![使用注解配置的好處,以及它們默認的配置信息](https://img-blog.csdn.net/20180414220304562?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
RequestMapping注解詳解![RequestMapping中的注解解析](https://img-blog.csdn.net/20180414221934621?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
前端控制器url-pattern攔截方式 及其 靜態資源訪問處理![兩種處理形式,一般url用"/",](https://img-blog.csdn.net/20180414225339222?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)<!-- 解決靜態資源訪問問題:1:排除法,非常SB2:實用<mvc:default-servlet-handler/>開開發中用的比較多原理:將SpringMVC上下文中定義一個D額DefaultServlcetHttpRequestHandler.對所有前端控制器的請求做篩選和盤查.如果發現沒有經過映射請求,就交給Tomcat的默認servlet來處理.3:資源映射時:<mvc:resources location="/" mapping="/**">--><!-- 方式一  --><!-- <mvc:default-servlet-handler/> --><!-- 方式二  --><mvc:resources location="classpath:/static/" mapping="/**"/>

三:請求和響應

1.處理方法設計

    Controller方法可以有多個不同類型的參數,以及一個多種類型的返回結果.

2.處理響應

@Controller
@RequestMapping("/response")
public class HandlerResponseController {//返回void類型,此時可以把Controller方法當做Servlet來使用@RequestMapping("/test1")public void test1(HttpServletRequest request,HttpServletResponse response) throws Exception{//請求轉發request.getRequestDispatcher("").forward(request,response);//URL重定向response.sendRedirect("");//設置共享數據request.setAttribute("","");//輸出JSON格式response.setContentType("test/json:charset=utf-8");response.getWriter().println("");}//返回void:文件下載@RequestMapping("test2")public void test2(OutputStream out) throws IOException{Files.copy(Paths.get("C:/123/04.Java集合框架-Iterable接口.avi"),out);}//返回ModelAndView@RequestMapping("test3")public ModelAndView test3(){ModelAndView mv = new ModelAndView();mv.addObject("msg", "返回ModelAndView");//設置共享數據的Key和Valuemv.addObject("隨便寫點什么是吧");//設置共享數據的value,此時會把value類型的首字母小寫的作為key:stringmv.setViewName("result");return mv;}//前綴: /WEB-INF/views///后綴: .jsp//物理視圖=前綴+邏輯視圖+后綴/**<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"></property><property name="suffix" value=".jsp"></property></bean>*/@RequestMapping("test4")public String test4(Model model){model.addAttribute("msg", "返回String");model.addAttribute("苗畦春17歲");return "result";}

3.請求跳轉

//請求轉發,瀏覽器地址欄不變,可以共享請求中的數據//原理:request.getRequestDispatcher("").forward(request,response);@RequestMapping("/test5")public String text5(Model model){return "forward:/hello.html";}//重定向,瀏覽器地址欄會變,不能共享請求中數據//原理:response.sendRedirect(""   );@RequestMapping("/test6")public String test(Model model){return "redirect:/hello.html";}/**請求轉發和URL重定向的選擇請求轉發           URL重定向--------------------------------------------地址欄                              不變     變化共享數據              可以        不能?表單重復提交        導致        不會請求資源路徑問題:  以后訪問資源你的時候都,使用/開頭重定向redirect:/hello.html       redirect:hello.html訪問資源的時候前面帶上/.表示絕對路徑,從根路徑開始去尋找資源.訪問資源的時候簽名不加/,表示從先對路徑,從上一級上下文路徑中去尋找資源/response/test6------>"redirect:/hello.html";---->localhost:/hello.html /response/test6------>"redirect: hello.html";---->localhost:/response/hello.html傳統的方式,在URL重定向的時候,因為是兩次不同的請求,所以不能共享請求中的數據,在開發中有的時候,真的需要重定向跳轉后共享數據.Sprint3.1開始提供了Flash屬性.  中能使用從Controller重定向到Controller,不能到JSP*/@RequestMapping("/a")public String a(RedirectAttributes ra){ra.addAttribute("msg1","msg1");ra.addFlashAttribute("msg2","msg2");return "redirect:/response/b";}@RequestMapping("/b")public ModelAndView b(String msg1,@ModelAttribute("msg2")String msg2){System.out.println("msg1:"+msg1);System.out.println("msg2:"+msg2);return null;}

spring知識點總結、四:攔截器

1.攔截器原理:

當收到請求時,DispatcherServlet將請求交給處理器映射(HandlerMapping),讓他找出對應該請求的HandlerExeutionChain對象.HandlerExecutionChain對象是一個執行鏈,包含一個處理該請求的處理器(Handler),同時包括多個對該請求實施攔截的攔截器(HandlerInterceptor),當HandlerMapping返回HandlerExecutionChain后,DispatcherServlet將請求交給定在HandlerExecutionChain中的攔截器和處理器一并處理.![攔截器原理圖](https://img-blog.csdn.net/20180415222059183?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
攔截器到底做了什么,我們可以通過考察攔截器的接口方法來進行了解.1.preHandle方法在請求達到Handler方法之前,先執行這個前置處理方法,當該方法返回false時,請求直接返回,不會傳遞到鏈中的下一個攔截器,更不會傳遞到處理鏈末端的Handler方法中,只有返回true時,請求才向鏈中的下一個處理節點傳遞.2.postHandler方法:控制器方法執行后,視圖渲染之前執行(可以加入統一的響應信息).3.afterCompletion方法:視圖渲染之后執行(處理Controller異常信息,記錄操作日志,清理資源等)

2.攔截器開發

開發SpringMVC攔截器步驟:1.定義攔截器類,實現接口org.springframework.web.servlet.HandlerInterceptor 2.applicationContext.xml文件中配置攔截器

五:SpringMVC綜合案例

domain

@Data
public class Employee {private Long id;//@NotNull(message="用戶名不能為空")//@Size(max=10,min=4,message="用戶名在4-10位之間")private String username;//@NotNull(message="密碼不能為空")//@Size(max=10,min=4,message="密碼在4-10位之間")private String password;//@NotNull(message="年齡不能為空")//@Min(value=18,message="最小歲數是18")//@Max(value=60,message="最大歲數是60")private Integer age;@DateTimeFormat(pattern="yyyy-MM-dd")private Date hiredate;}

對mvc的理解。dao

public interface EmployeeDAO {void save(Employee emp);void update(Employee emp);void delete(Long id);Employee get(Long id);List<Employee> listAll();Employee checkLogin(String username, String password);
}

impl

@Repository
public class EmployeeDAOImpl implements EmployeeDAO{private JdbcTemplate jdbcTemplate;@Autowiredpublic void setDataSource(DataSource dataSource){this.jdbcTemplate = new JdbcTemplate(dataSource);}public void save(Employee emp) {jdbcTemplate.update("INSERT INTO employee (username,password,age,hiredate) VALUES (?,?,?,?)",emp.getUsername(),emp.getPassword(),emp.getAge(),emp.getHiredate());}public void update(Employee emp) {jdbcTemplate.update("UPDATE employee SET username=? ,password=?,hiredate=? WHERE id=?",emp.getUsername(),emp.getPassword(),emp.getHiredate(),emp.getId());}public void delete(Long id) {jdbcTemplate.update("DELETE FROM employee where id = ?",id);}public Employee get(Long id) {List<Employee> list = jdbcTemplate.query("SELECT id,username,password,age,hiredate from employee where id = ?",new Object[]{id},(rs,rowNum)->{Employee e = new Employee();e.setId(rs.getLong("id"));e.setUsername(rs.getString("username"));e.setPassword(rs.getString("password"));e.setAge(rs.getInt("age"));e.setHiredate(rs.getDate("hiredate"));return e;});return list.size()==1? list.get(0):null;}public List<Employee> listAll() {return jdbcTemplate.query("SELECT id,username,password,age,hiredate from employee",new Object[]{},new RowMapper<Employee>(){//把每一行結果集映射成一個Employee對象public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {Employee e = new Employee();e.setId(rs.getLong("id"));e.setUsername(rs.getString("username"));e.setPassword(rs.getString("password"));e.setAge(rs.getInt("age"));e.setHiredate(rs.getDate("hiredate"));return e;}});}public Employee checkLogin(String username, String password) {List<Employee> list = jdbcTemplate.query("SELECT id,username,password,age,hiredate from employee WHERE username = ? AND password = ?",new Object[]{username,password},(rs,rowNum)->{Employee e = new Employee();e.setId(rs.getLong("id"));e.setUsername(rs.getString("username"));e.setPassword(rs.getString("password"));e.setAge(rs.getInt("age"));e.setHiredate(rs.getDate("hiredate"));return e;});return list.size()==1 ? list.get(0): null;}
}

service

public interface IEmployeeService {void save (Employee emp);void update (Employee emp);void delete (Long id);Employee get(Long id);List<Employee> listAll();void login(String username, String password);
}

impl

@Service
@Transactional
public class EmployeeServiceImpl implements IEmployeeService{@Autowiredprivate EmployeeDAO dao;public void save(Employee emp) {dao.save(emp);}public void update(Employee emp) {dao.update(emp);}public void delete(Long id) {dao.delete(id);}@Transactional(readOnly=true)public Employee get(Long id) {Employee employee = dao.get(id);return employee;}@Transactional(readOnly=true)public List<Employee> listAll() {List<Employee> listAll = dao.listAll();return listAll;}@Transactional(readOnly=true)public void login(String username, String password) {Employee current = dao.checkLogin(username,password);if(current == null){throw new RuntimeException("賬號或密碼錯誤");}UserContext.setCurrentUser(current);}
}

util

//封裝當前登錄用戶的上下文信息.
public class UserContext {private static final String USER_IN_SESSION = "user_in_session";//獲取HttpSession對象public static HttpSession getSession(){return ((ServletRequestAttributes) (RequestContextHolder.getRequestAttributes())).getRequest().getSession();}public static void setCurrentUser(Employee current){if(current==null){getSession().invalidate();}else{getSession().setAttribute(USER_IN_SESSION,current);}}public static Employee getCurrentUser(){return (Employee) getSession().getAttribute(USER_IN_SESSION);}
}

mvc實訓個人總結。exception

//處理異常
@ControllerAdvice
public class HandlerExceptionAdvice {@ExceptionHandler()public String error(Exception ex,Model model){model.addAttribute("errorMsg",ex.getMessage());return "commons/error";}
}

web.interceptor

//攔截器
public class CheckLoginInterceptor implements HandlerInterceptor{public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {//沒有登錄的情況if(UserContext.getCurrentUser()== null){//因為此處的攔截器找不到存錯了的session對象,所以導致跳轉到/login.jsp頁面,并且得不到放行,因為/employee/list被攔截器設置攔截了response.sendRedirect("/login.jsp");return false;//阻止往后放行}System.out.println("放行");return true;//放行,放行給下一個攔截器或最終的處理器.}
}

web.controller

@Controller
@RequestMapping("/employee")
public class EmployeeController {@Autowiredprivate IEmployeeService service;@RequestMapping("/list")public String list(Model model){//int a = 1/0;List<Employee> listAll = service.listAll();model.addAttribute("employees",listAll);return "employee/list";}@RequestMapping("/input")public String input(Model model,Long id){if(id!=null){Employee e = service.get(id);model.addAttribute("emp",e);}return "employee/input";}@RequestMapping("/saveOrUpdate")public String saveOrUpdate(Employee e){if(e.getId() == null){service.save(e);}else{service.update(e);}return "redirect:/employee/list";}@RequestMapping("/delete")public String delete(Long id){if(id!=null){service.delete(id);}return "redirect:/employee/list";}
}
@Controller
public class LoginController {@Autowiredprivate EmployeeServiceImpl service;/**此處的作用就是先讓login.jsp放行到login中,然后從login中存儲session對象,這樣他在進入/employee/list之前的攔截器就會有了session對象,給/employee/list放行*/@RequestMapping("/login")public String login(String username,String password,HttpSession session){try {service.login(username,password);} catch (Exception e) {session.setAttribute("errorMsg",e.getMessage());return "redirect:/login.jsp";}//既然能來到這,就說明賬號跟密碼正確,但是進去/employee/list之前要經過攔截器System.out.println("LoginController.login()");return "redirect:/employee/list";}
}
@Controller
public class FileUploadController {@Autowiredprivate ServletContext servletContext;@RequestMapping("/save")public ModelAndView save(Employee e,MultipartFile pic) throws Exception{System.out.println(e);String fileName = pic.getOriginalFilename();System.out.println(fileName);String saveDir = servletContext.getRealPath("/upload");Files.copy(pic.getInputStream(),Paths.get(saveDir, fileName));return null;}
}
@Controller
public class FileDownLoadController {//沒有處理IE看著以前WEB的視頻設置就行@RequestMapping("/download1")public void download1(String fileName,HttpServletRequest request,HttpServletResponse response) throws Exception{String dir = request.getServletContext().getRealPath("/WEB-INF/down");//設置響應頭,下載文件response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);//設置建議保存名稱response.setHeader("Content-Disposition","attachment;filename="+fileName);Files.copy(Paths.get(dir,fileName),response.getOutputStream());}//第二種方法了解就行,看龍哥視頻去了解@RequestMapping("/download2")public ResponseEntity<byte[]> download2(String fileName,HttpServletRequest request,HttpServletResponse response) throws Exception{String dir = request.getServletContext().getRealPath("/WEB-INF/down");HttpHeaders headers = new HttpHeaders();//設置響應頭,下載文件headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//設置建議保存名稱headers.setContentDispositionFormData("attachment",fileName);return new ResponseEntity<>(FileUtils.readFileToByteArray(new File(dir,fileName)),headers,HttpStatus.CREATED);}
}

web.xml

<!-- 編碼設置器 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>       </filter-mapping><servlet><servlet-name>springDispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup><multipart-config><location>c:/temp</location><max-file-size>10248466</max-file-size><max-request-size>10249568</max-request-size><file-size-threshold>10240</file-size-threshold></multipart-config></servlet><servlet-mapping><servlet-name>springDispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>

mvc.xml

<import resource="classpath:applicationContext.xml"/><context:component-scan base-package="cn.wolfcode"/><mvc:default-servlet-handler/><mvc:annotation-driven/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"></property><property name="suffix" value=".jsp"></property></bean><!-- 注冊攔截器 --><!-- 對哪些資源做攔截/*   :只能攔截一級路徑,如/delete, /save,如果/employee/list就沒有效果了/**  :可以攔截一級或多級路徑. --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**" /><mvc:exclude-mapping path="/login"/><bean class="cn.wolfcode.web.interceptor.CheckLoginInterceptor"/></mvc:interceptor></mvc:interceptors><!-- 配置異常處理器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 設置錯誤的視圖 --><property name="defaultErrorView" value="commons/error"></property><!-- 在錯誤頁面,獲取異常信息對象變量名稱,缺省exception --><property name="exceptionAttribute" value="ex"></property><!-- 根據不同的類型異常,跳轉到不同的錯誤頁面 --><property name="exceptionMappings"><!-- xxxx.serviceException=commons/nopermissi --></property></bean><!-- Apache方式文件上傳解析器  --><!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">限制文件大小<property name="maxUploadSize" value="1048576"></property></bean> --><!-- servlet3.0的文件上傳解析器  所以要交給web.xml的來配置他的屬性,initParam下面配置--><bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>

javaweb三層架構和mvc架構。applicationContext.xml

        <context:component-scan base-package="cn.wolfcode"/>        <context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="driverClassName" value="${jdbc.driverClassName}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property><property name="initialSize" value="${jdbc.initialSize}"></property></bean><!-- 1:WHAT:配置JDBC事務 管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>

db.properties

#key=value
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springdemo
jdbc.username=root
jdbc.password=111111
jdbc.initialSize=2

login.jsp

<h3>登錄界面</h3><span style="color: red">${errorMsg}</span><%session.invalidate();%><form action="/login" method="POST">賬號:<input type="text" name="username" /><br/>密碼:<input type="text" name="password" /><br/><input type="submit" value="提交表單"/></form>

input.jsp

        <form action="/save" method="POST" enctype="multipart/form-data">姓名:<input type="text" name="username"/><br/>年齡:<input type="text" name="age"/><br/>文件:<input type="file" name="pic"/><br/><input type="submit" value="提交"/></form><hr/><a href="/download2?fileName=butter.rar">butter.rar</a>

views-employee

springcload面試題常問,list.jsp

        <h4>員工列表,當前登錄用戶為:${user_in_session.username}</h4><a href="/login.jsp">注銷登錄</a><hr/><a href="/employee/input" >新增</a><table border="1" cellspacing="0" cellpadding="0" width="500"><tr><th>ID</th><th>用戶名</th><th>密碼</th><th>年齡</th><th>入職日期</th><th>操作</th></tr><c:forEach items="${employees}" var="e"><tr><td>${e.id}</td><td>${e.username}</td><td>${e.password}</td><td>${e.age}</td><td>${e.hiredate}</td><td><a href="/employee/delete?id=${e.id}">刪除</a><a href="/employee/input?id=${e.id}">編輯</a></td></tr></c:forEach>        </table>

input.jsp

        <h3>添加員工</h3><form action="/employee/saveOrUpdate" method="POST"><input type="hidden" name="id" value="${emp.id}">賬號:<input type="text" name="username" value="${emp.username}"/><br/>密碼:<input type="text" name="password" value="${emp.password}"/><br/>年齡:<input type="text" name="age" value="${emp.age}"/><br/>入職:<input type="text" name="hiredate" value="${emp.hiredate}"/><br/><input type="submit" value="提交表單"/></form><hr/><!-- 使用SpringMVC表單標簽,需要先引入taglib標簽庫,然后再引入springmvc中的form標簽 然后就可以看著小龍老師的視頻使用了-->

views-commons

error.jsp

    出錯啦:${errorMsg}

六:異常處理:

SpringMVC處理異常的3種方式:(1):使用SpringMVC提供的簡單異常處理SimpleMappingExceptionResolver; (有例子)(2):實現Spring的異常處理接口HandlerExceptionResolver自定義自己的異常處理器;(3):使用@ExceptionHandler注解實現異常處理;  (使用最多)

Java mvc、七:數據校驗

數據校驗是WEB開發任務之一,在SpringMVC中有兩種方式可以實現,分別是使用Spring自帶的驗證框架和使用JSR 303實現,也稱為Spring-validator和jsr303-validator.開發中更建議使用jsr303-validator.![校驗標簽](https://img-blog.csdn.net/20180415235415385?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)![校驗標簽](https://img-blog.csdn.net/20180415235524801?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

八;SpringMVC標簽

SpringMvc標簽通過SpringMVC的表單標簽可以實現將模型數據中的屬性和HTML表單元素綁定,以實現表單數據更便捷編輯和表單的回寫.![表單標簽庫中的標簽](https://img-blog.csdn.net/20180416000140179?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)![input標簽的屬性](https://img-blog.csdn.net/20180416000248152?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)![表單標簽的屬性](https://img-blog.csdn.net/20180416000546145?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)![password標簽的屬性](https://img-blog.csdn.net/20180416000628113?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDE2MTcwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)hidden標簽的屬性:屬性                        描述htmlEscape         接受true或者false,表示是否應該對被渲染的值進行HTML轉義path               要綁定的屬性路徑
員工的增加列表與編輯列表:先添加標簽:<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>此時的屬性名就是employee跟,表名一致<form:form action="/employee/saveOrUpdate" modelAttribute="employee"><form:hidden path="id"/><br/>賬號:<form:input path="username"/><form:errors path="username"/><br/>密碼:<form:input path="password" showPassword="true"/><form:errors path="password"/><br/>年齡:<form:input path="age"/><form:errors path="age"/><br/>入職:<form:input path="hiredate"/><form:errors path="hiredate"/><br/><input type="submit" value="提交表單"/></form:form>雖然不是編輯人,也需要傳入一個employee,@RequestMapping("/input")public String input(Model model,Long id){if(id!=null){Employee e = service.get(id);model.addAttribute("employee",e);}else{model.addAttribute("employee",new Employee());}return "employee/input";}

九:文件的上傳和下載

1.文件上傳

SpringMVC的文件上傳兩種方式:1:基于Apache的上傳組件先拷貝jar包:com.springsource.org.apache.commons.fileupload-1.2.0.jarcom.springsource.org.apache.commons.io-1.4.0.jarMVC.XML中配置--文件上傳解析器:<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">限制文件大小<property name="maxUploadSize" value="1048576"></property></bean>2:基于Servlet3.0  不需要拷貝jar包, SpringBoot里默認支持,不依賴Apacher,圍繞MultipartConfig注解,Part接口,webService中講過.MVC.XML中配置--文件上傳解析器:<!-- servlet3.0的文件上傳解析器  所以要交給web.xml的來配置他的屬性,initParam下面配置--><bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>WEB.XML中配置文件屬性等:<servlet><servlet-name>springDispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup><!--文件上傳的配置--><multipart-config><location>c:/temp</location><max-file-size>10248466</max-file-size><max-request-size>10249568</max-request-size><file-size-threshold>10240</file-size-threshold></multipart-config></servlet>

上傳跟下載的JSP文件

    1.請求方式必須是post   2.使用multipart/form-data形式   3.有上傳文件file<form action="/save" method="POST" enctype="multipart/form-data">姓名:<input type="text" name="username"/><br/>年齡:<input type="text" name="age"/><br/>文件:<input type="file" name="pic"/><br/><input type="submit" value="提交"/></form><hr/><a href="/download2?fileName=butter.rar">butter.rar</a>

java中mvc是什么意思,Controller代碼

    @Controllerpublic class FileUploadController {@Autowiredprivate ServletContext servletContext;@RequestMapping("/save")public ModelAndView save(Employee e,MultipartFile pic) throws Exception{System.out.println(e);String fileName = pic.getOriginalFilename();System.out.println(fileName);String saveDir = servletContext.getRealPath("/upload");Files.copy(pic.getInputStream(),Paths.get(saveDir, fileName));return null;}}

2.文件下載

@Controller
public class FileDownLoadController {//沒有處理IE看著以前WEB的視頻設置就行@RequestMapping("/download1")public void download1(String fileName,HttpServletRequest request,HttpServletResponse response) throws Exception{String dir = request.getServletContext().getRealPath("/WEB-INF/down");//設置響應頭,下載文件response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);//設置建議保存名稱response.setHeader("Content-Disposition","attachment;filename="+fileName);Files.copy(Paths.get(dir,fileName),response.getOutputStream());}//第二種方法了解就行,看龍哥視頻去了解@RequestMapping("/download2")public ResponseEntity<byte[]> download2(String fileName,HttpServletRequest request,HttpServletResponse response) throws Exception{String dir = request.getServletContext().getRealPath("/WEB-INF/down");HttpHeaders headers = new HttpHeaders();//設置響應頭,下載文件headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//設置建議保存名稱headers.setContentDispositionFormData("attachment",fileName);return new ResponseEntity<>(FileUtils.readFileToByteArray(new File(dir,fileName)),headers,HttpStatus.CREATED);}
}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/105276.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息