是根據B站視頻中尚學堂某個老師的視頻自學來的,不保證正確,算是自己踩的一些坑.大概是根據那個進行總結了一下.都是比較基礎的東西吧.
視頻地址
-
web.xml的配置.
-
配置爲Servlet,
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--下面設置爲更改默認配置文件,如果不設置這裏,那麼需要在WEB-INF下面寫一個springmvc的配置文件
默認名字爲 servletName-servlet.xml如這裏的springmvc-servlet.xml-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:mvc.xml</param-value>
</init-param>
<!-- load-on-startup定義爲1即爲應用開始即執行.-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--這裏的url-parrrern我理解爲打開springmvc的設置,即只有訪問到這裏的時候纔會運行springmvc.如果設置爲根目錄,則任何時候都會執行springmvc,然後在springmvc的配置文件裏執行查找處理器,渲染等操作.-->
<url-pattern>/</url-pattern>
</servlet-mapping>
-
配置springmvc的配置文件.
-
流程大概就是handlermapping處理傳進來的url地址並交給控制器進行處理,處理之後的數據交給渲染器,然後返回頁面.
有兩種方法可以進行配置- 1.使用xml文件配置.
- 第一種方法
<!--配置handler mapping--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--配置handler adapter,根據教程所講內容,若配置這裏springmvc會自動進行適配,若不配置這裏,則請求的url地址嚴格根據名字來進行(包括後綴)--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> <!--配置渲染器--> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!--配置接收和處理器--> <bean name="/hello" class="com.netizen.springmvc.HelloComtroller"></bean>
-
第二種方法
<!--第二種配置springmvc的controller的方法,非註解的方法,使用集合,一次性配置多個controller--> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <!--key對應url的請求地址,value爲處理器的!! ID !!,這樣還需要在外部再寫一個bean進行配置.--> <prop key="hello.do">HelloController</prop> </props> </property> </bean> <bean id="HelloController" class="com.netizen.springmvc.HelloComtroller"></bean>
-
第三種方法
<!--第三種配置,URL匹配,這個沒太明白,好像是根據Controller的類名字來進行匹配的,不太懂--> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean> <!--比如這裏的類名字爲helloController,那麼將自動匹配url爲hello*的地址進行處理.--> <bean id="HelloController" class="com.netizen.springmvc.HelloComtroller">
2.使用註解
<!--添加下列語句自動掃包,然後只配置一個渲染器.--> <context:component-scan base-package="com.netizen.springmvc"/> <!--配置渲染器--> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
-
控制器類的填寫,請求過來的內容在這裏進行處理.
-
兩種實現方法
1.不使用註解,對應springmvc不使用註解的配置//實現Controller接口,然後重寫方法,handleRequest,返回一個ModelAndView實例. public class HelloComtroller implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mv = new ModelAndView(); // 這裏還不是很理解. mv.addObject("msg","hello,springmvc"); // 視圖名字,在這裏設置好之後對應springmvc配置文件裏面的前後綴方法,會自動在應用裏尋找視圖,如這裏會尋找/WEB-INF/jsp/hello.jsp. mv.setViewName("hello"); return mv; } }
2.使用註解:
//添加Controller註解和RequestMapping()註解進行配置,對應使用註解的springmvc配置. @Controller public class HelloC { // 請求爲*.do的時候就會去尋找一個hello的視圖去返回.在web.xml裏面配置的是當請求在/的時候會調用mvc的框架開始運行和處理. @RequestMapping("/*.do") public ModelAndView hello(HttpServletRequest request, HttpServletResponse response){ ModelAndView mv = new ModelAndView(); mv.addObject("msg","annotation springmvc "); mv.setViewName("hello"); return mv; } }
-
數據處理和轉發
-
內容比較少,這部分都寫在代碼裏面了,要注意一下return時候的跳轉,這是在沒有頁面渲染器的情況下寫的,跳轉到的都是index.jsp,因爲index在根目錄下,這裏我感覺不使用渲染器那麼就得寫絕對路徑了,感覺上有點不太方便.
package com.netizen.springmvc; //轉發和重定向的方法. import ... @Controller public class HelloZF { @RequestMapping("/hello1") public void hello1(HttpServletRequest request,HttpServletResponse response) throws IOException { response.getWriter().println("轉發和跳轉的實驗1"); } // 使用HttpServlet進行重定向 @RequestMapping("/hello2") public void hello2(HttpServletRequest request,HttpServletResponse response) throws IOException { response.sendRedirect("index.jsp"); } //使用HttpServlet進行轉發 @RequestMapping("/hello3") public void hello3(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { request.setAttribute("msg","hello3 method"); request.getRequestDispatcher("index.jsp").forward(request,response); } // 通過springMVC進行轉發和重定向----上面的就是普通的Servlet-api的方法.下面這是無視圖解析器時候的方法. @RequestMapping("/hello4") public String hello4(HttpServletRequest request,HttpServletResponse response){ //這裏的return hello,實際上因爲有視圖解析器的存在會跳到WEB-INF/jsp路徑下去尋找.. // return "hello"; System.out.println("request的值爲 ---" + request); request.setAttribute("msg","index.jsp have been forward"); return "forward:index.jsp"; // return "redirect:index.jsp"; } // 通過SpringMVC進行轉發和重定向 ----有視圖解析器的時候. @RequestMapping("/hello5") public String hello5(){ // 沒節省多少,轉發可以少寫.重定向的話因爲是直接跳到另一個網頁上,所以不需要視圖解析器. // return "hello"; return "redirect:index.jsp"; } // data的獲取.可以指定域請求的參數名字,使用@RequestParam註解. @RequestMapping("/hello6") public String hello6(@RequestParam("uname")String name){ System.out.println("name的值爲 ---" + name); return "index.jsp"; } //從域參數中得到一個實例 @RequestMapping("/user") public String hello7(User user){ System.out.println(user); return "index.jsp"; } @RequestMapping("/hello8") public String hello8(@RequestParam("uname")String name, ModelMap mp){ mp.addAttribute("name",name); return "index.jsp"; } }
數據處理的內容還是相對簡單的,這裏我有一個疑問,就是post的咋辦?後邊學習應該會講吧..
-
亂碼的解決和Restful
-
亂碼的解決
<!--SpringMVC的filter解決亂碼的問題.這個方法似乎只能解決post亂碼的問題.get亂碼通常是因爲jsp文件裏面pageencoding屬性不是utf-8--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>CharacterEncodingFilter</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/</url-pattern> </filter-mapping>
-
Restful風格
// restful風格代碼的編寫,其實是一種從url地址中獲得參數的方法,如此不用再寫RequestParam // 注意使用這種方法的時候,如果在web.xml裏面定義了打開springmvc的url-pattern,那麼需要變化後綴. @RequestMapping("/hello9/{id}/{uid}") public String hello(@PathVariable int id,@PathVariable int uid){ // 也可以使用下面這種方式,使用帶參的註解,表示將url中id的值傳遞給了uid // public String hello(@PathVariable("id") int uid,@PathVariable("uid") int id) System.out.println("id的值爲 ---" + id); System.out.println("uid的值爲 ---" + uid); return "index.jsp";
-
使用commons-fileupload和commons-io包進行文件的上傳
-
1.在springMVC的xml文件中配置fileupload的解析器.
<!--SpringMVC的filter解決亂碼的問題.這個方法似乎只能解決post亂碼的問題.get亂碼通常是因爲jsp文件裏面pageencoding屬性不是utf-8--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>CharacterEncodingFilter</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/</url-pattern> </filter-mapping>
-
2.編寫fileupload的Controller
@Controller public class fileUploadController { @RequestMapping("/upload") // 需要注意的一點是,這裏必須要寫 @requestparam(file) public String fileupload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException { // 這裏要比較熟悉java的IO才行,還不太熟練。 // 獲取上傳文件的路徑。 String path = request.getRealPath("/fileupload"); // 因爲已經是上傳的文件,已經打開了一個寫入流。 InputStream is = file.getInputStream(); // 輸出流 OutputStream os = new FileOutputStream(new File(path,file.getOriginalFilename())); int len=0; byte[] buffer = new byte[400]; while((len=is.read())!=-1){ os.write(buffer,0,len); } os.close(); is.close(); return "index"; } }
-
3.編寫upload.jsp
<%-- method必須爲post,enctype=multipart/form-data --%> <form action="upload" method="post" enctype="multipart/form-data"> file:<input type="file" name="file"> <input type="submit" value="上傳"> </form>
-
4.坑:maven打包,不會打包webapp裏面的fileupload文件夾.
查找了一些資料:
使用plugin 插件
使用插件
不忽略空文件夾
打包到指定文件夾 繁瑣一些以上方法似乎都不可行.我操.
到最後還是部署之後自己在target裏創建的文件夾…
-
進行ajax和json的傳遞
-
1.使用HttpServlet
@Controller public class AjaxController { @RequestMapping("/ajax") public void ajax(String name,HttpServletResponse response) throws IOException { response.getWriter().println("123123"); }
-
2.使用jackson的包和配置文件進行設置.
主要需要注意的是springmvc的配置文件怎麼寫.視頻裏的那個類我沒找到,百度得到結果是那個類已經不用了,改爲使用另一個類,還有一個說法是使用<!--<mvc:annotation-driven/>
這個東西來進行對json的處理,但是我弄了之後總是報錯,我也看不懂錯在哪..所以還是使用了替代的類.
配置如下:<!--註解的使用打開--> <context:component-scan base-package="com.springMVC"></context:component-scan> <!--打開json的解析器--> <!--<mvc:annotation-driven></mvc:annotation-driven>--> <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="stringConverter"></ref> <ref bean="jsonConverter"></ref> </list> </property> </bean>
這樣返回的結果就是json的對象了,在前端進行處理.
-
關於攔截器
-
視頻中講的很簡單..配置一下,實現了三個方法.應該深入一些..
<!--配置攔截器--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.springMVC.interceptorController"></bean> </mvc:interceptor> </mvc:interceptors>
-
登陸攔截器,這裏比較重要,對我來說有點彎路..
簡單點來說就是當在login.jsp中點擊submit提交到login
之後,本來應該是由UserController來進行處理,查看是否密碼正確,如果正確則建立一個session,如果不正確返回到當前頁面,現在加入了一個攔截器,,作用就是攔截當前界面,查看是否已經登陸,實際上,我認爲老師這裏講的不是很清晰,覺得流程應該是當訪問一個頁面的時候,如果沒有用戶沒有登陸卻訪問了界面,那麼就會被攔截下來,然後跳轉到登陸界面,讓用戶進行登陸,如果訪問的網址在允許訪問的列表裏面,纔會接着進行訪問,返回true,然後進行用戶名密碼的判斷,如果正確則建立一個session.否則,重新開始.
-
log4j idea的使用(Maven)
- 1.Maven的pom.xml中添加包依賴
- 2.配置log4j.properties,參考資料1 參考資料2 參考資料3
參考資料4:改變配置文件路徑. - 3.記得在pom.xml文件裏面把log4j.properties的過濾給去掉.
-
使用IDEA創建SpringMVC(未使用Maven)
- 1.創建時選擇SpringMVC,Spring,WebService三個,讓idea自動下載包.
- 2.下載tomcat,配置好tomcat,包括端口一類的設置.
- 3.項目配置(ctrl+shift+alt+s):
- 導入Tomcat/lib下的servlet-api和jsp-api包,否則會找不到包(我似乎導入了也不能自動給出提示,還需要在類裏手動導包,不懂咋回事.)
- 除此之外,還需要下載
jstl
和standard
這倆包,否則在配置springmvc的時候同樣會報錯,具體情況不太瞭解,好像是servlet的xml配置標準根據這個來的. - 在WEB-INF下創建classes和lib和jsp三個文件夾.
1.
2.
3.
4.
如此應該可以運行了.這裏配置可能有誤,因爲我也看不懂,大概是整合了網上了的一些教程吧.
4.結構圖.
使用Maven進行配置了一遍.根據這個教程:SpringMVC indea maven 配置教程
其中碰到的小坑1:需要安裝完整的包:jstl jstl-api, standard jstl-impl 這四個都需要在maven裏面配置上.
其中碰到的小坑2:自定義設置SpringMVC的xml文件位置的時候,由於maven的限制,不能輸出到target裏面,參考:maven idea springmvc target