Spring MVC 他是基於MVC的設計模式做出來的,他是Spring對Servlet的進一步的封裝 MVC:Model View Controller 如何使用Spring MVC?(Spring 和 Spring MVC整合) a. pom.xml 導入 SpringMVC.jar <!-- ...
Spring MVC
他是基於MVC的設計模式做出來的,他是Spring對Servlet的進一步的封裝
MVC:Model View Controller
如何使用Spring MVC?(Spring 和 Spring MVC整合)
a. pom.xml 導入 SpringMVC.jar
<!-- Spring 5 與SpringMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency>
b. 配置(xml 標註):AppConfig類
@Configurable
@EnableWebMvc
@ComponentScan({"day"})
package day; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.servlet.view.UrlBasedViewResolver; /** * 基於註解的配置類(JavaConfig配置) * @author 張澤 */ @Configuration @EnableWebMvc @ComponentScan({"day"}) public class AppConfig { /** * jsp的解析器 * 這個Bean的作用就是告訴Spring MVC 你寫的JSP文件的位置 * @return */ @Bean public UrlBasedViewResolver setupViewResolver() { UrlBasedViewResolver resolver = new UrlBasedViewResolver(); resolver.setPrefix("/WEB-INF/");//-- 位置 受保護的,不可以直接訪問 resolver.setSuffix(".jsp"); //-- jsp文件的尾碼,你在寫頁面的時候就省略掉尾碼 resolver.setViewClass(JstlView.class); return resolver; } } /** 換句話說:我們要先配置好那個Servlet,並且在伺服器啟動的時候把它實例化 (1)tomcat啟動的時候,SpringMVC框架寫了監聽器ContextListener(ServletContextListener) (2)在ServletContextListener中實例化這個核心的Servlet (3)這個Serlet攔截一切請求 (4)攔截請求後,在獲取請求的路徑轉發給對應的Controller (5)Controller再進行相應的請求的處理 想法:所有的Bean要納入到Spring容器來管理,才能實現面向介面的編程 Tomcat 啟動後,會不會有Spring容器。 當Tomcat啟動的時候,我們實例化一個Spring容器。然後把它放到ServletContext SpringMVC: (1)在Tomcat啟動的時候,實例化一個Spring容器放入到ServletContext對象里 (2)並且在ServletContext中實例化那個核心的Servlet (3)而且該Servlet攔截一切請求 */
WebInitializer類:web容器啟動得時候會調用該類得onStartup方法初始化工作:Spring容器與SpringMVC框架
package day; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; /** * Tomcat 啟動的時候會檢測是否有WebApplicationInitializer介面的類 * 若檢測到有這個類,就會實例化它,並調用他的onStartup方法 * @author 張澤 */ public class WebInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { System.out.println("startup invoker the method"); //-- 1. 構造Spring容器 AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); //-- 2. Spring容器載入配置 ctx.register(AppConfig.class); //-- 3. Spring容器接管servletContext應用上下文對象 ctx.setServletContext(servletContext); //-- 4. 添加Servlet(至少添加一個Servlet,SpringMVC框架實現的入口Servlet) ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher",new DispatcherServlet(ctx)); servlet.addMapping("/"); servlet.setLoadOnStartup(1); } //-- 你想使用Spring,就得有Spring容器得實例, //-- 你想使用SpringMVC就得配置DispatcherServlet得實例, //-- 還要把這兩個東西放到ServletContext 對象里,為什麼呢? //-- 因為他們兩個都是重量級對象 }
調用類
package day; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.alibaba.fastjson.JSON; import day.entity.User; @Controller public class HelloController { @RequestMapping("/hello") public void hello() { System.out.println("hello"); } @RequestMapping("/hi") public void hi() { System.out.println("hi"); } @RequestMapping("/index") //-- 代表映射路徑 public String index(HttpServletRequest request, HttpServletResponse response) { //-- 方法名 String name = request.getParameter("name"); System.out.println(name); try { PrintWriter out = response.getWriter(); out.write("adsfasdfasdf"+name); out.close(); } catch (IOException e) { e.printStackTrace(); } return "index";//-- 頁面得名字 } /** * 返回字元串 * @return */ @RequestMapping("/data") @ResponseBody public String aaa() { List<User> users = new ArrayList<User>(); users.add(new User("zz",15)); users.add(new User("zz",15)); users.add(new User("zz",15)); //-- 2. 用alibaba得fastJson工具 String jsonStr = JSON.toJSONString(users); return jsonStr; //return "[{'name':zz,'age':15}]"; } /** * 返回得是頁面,並且可以給頁面傳遞數據 * @return */ @RequestMapping("/test") public ModelAndView bbb(HttpServletRequest request,HttpServletResponse response) { ModelAndView mv = new ModelAndView("test"); //-- do something query data mv.addObject("message", "寶塔鎮河妖"); return mv; //底層: // request.setAttribute("message", "hello"); // try { // request.getRequestDispatcher("/WEB-INF/test.jsp").forward(request, response); // } catch (ServletException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } }
其他小知識點:
之前的訪問連接:URL: http://localhost:8080/hello?name=xxx&word=122
RestFul形式介面:
http://localhost:8080/hello/name/zhangsan/password/123456
實現:hello/zhangsan/123456
@RequestMapping("/hello/{name}/{password}")
public String getUser(
@pathVariable("name") String name,
@pathVariable("password") String password){}
Get與Post請求:
方法一:
@RequestMapping(value="",method=RequestMethod.GET)
@RequestMapping(value="",method=RequestMethod.Post)
方法二:
Get請求:@GetMapping("") 相等於: @RequestMapping(value="",method=RequestMethod.GET)
Post請求:@PostMappping("")