Web快速開發(二)
阿新 • • 發佈:2019-01-05
Web快速開發
A、Spring Boot 對 Web 開發做了很大的優化,包括開發、測試、部署都做了支援。
B、spring-boot-starter-web 是 Spring Boot 對 Web 開發的支援,主要包括 RESTful、引數校驗、使用 Tomcat作為內嵌容器等功能。
1、新建springboot-web專案
(1)新建 User 類 public class User { @NotEmpty(message="姓名不能為空") private String name; @Max(value = 100, message = "年齡不能⼤大於 100 歲") @Min(value= 18 ,message= "必須年滿 18 歲!" ) private int age; @NotEmpty(message="密碼不能為空") @Length(min=6,message="密碼⻓長度不能⼩小於 6 位") private String password; //setter、getter方法、空參、帶參構造省略 } (2)新建webController類 @RestController public class WebController { @RequestMapping("/getUser") public User getUser(){ User user=new User(); user.setName("科比"); user.setAge(12); user.setPassword("123456"); return user; } @RequestMapping("/getUsers") public List<User> getUsers(){ List<User> users=new ArrayList<User>(); User u1=new User(); u1.setName("艾佛森"); u1.setAge(14); u1.setPassword("111111"); users.add(u1); User u2=new User(); u2.setName("阿倫"); u2.setAge(10); u2.setPassword("666666"); users.add(u2); return users; } /** * 請求傳遞引數: * 使用 Spirng Boot 可以輕鬆的對請求做⼀一些限制,比如為了安全只允許 POST * 請求的訪問。只需要在⽅方法上新增⼀一個配置即可 * 這時候再以 get 請求去訪問,就會返回: Request method 'GET' not supported */ // @RequestMapping(name="/getUser", method= RequestMethod.POST) // public User getUser() { // // } /** * Spring Web 層支援多種⽅方法傳參,上篇文章中傳⼊入⼀一個屬性 name,其直接使用物件接收也是支援的。 * 這樣的寫法,只要是 User 的屬性都會被⾃自動填充到 user 物件中 */ // @RequestMapping(name="/getUser", method= RequestMethod.POST) // public String getUser(User user) { // // } /** * 使⽤用 Url 進行傳參 * 瀏覽器訪問:http://localhost:8080/get/kid,返回: {"name":"kid","age":0,"pass":null} ,說明name 值已經傳⼊入成功。 */ @RequestMapping(value="get/{name}", method=RequestMethod.GET) public User get(@PathVariable String name) { User user=new User(); user.setName(name); return user; } /** * Spring Boot 的引數校驗其實是依賴於 hibernate-validator 來進行。 * 現在模擬對引數 User 進⾏行引數校驗,使用 @Valid + BindingResult * * @param user * @param result */ @RequestMapping("/saveUser") public void savaUser(@Valid User user, BindingResult result){ System.out.println("user:"+user); if(result.hasErrors()){ List<ObjectError> list=result.getAllErrors(); for(ObjectError error : list){ System.out.println(error.getCode()+"====="+error.getDefaultMessage()); } } } } (3)測試類 @SpringBootTest public class WebControllerTest { private MockMvc mockMvc; @Before public void setUp() throws Exception{ mockMvc = MockMvcBuilders.standaloneSetup(new WebController()).build(); } @Test //{"name":"科比","age":12,"pass":"123456"} public void getUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/getUser")).andDo(print()); } @Test //[{"name":"艾佛森","age":14,"password":"111111"},{"name":"阿倫","age":10,"password":"666666"}] public void getUsers() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/getUsers")).andDo(print()); } /** * user:User{name='', age=666, password='test'} * Length=====密碼⻓長度不能⼩小於 6 位 * Max=====年齡不能⼤大於 100 歲 * NotEmpty=====姓名不能為空 * @throws Exception */ @Test public void saveUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/saveUser") .param("name","") .param("age","666") .param("password","test") ).andDo(print()); } }
3、自定義 Filter
專案中會使用 Filters 用於記錄請求日誌、排除有 XSS 威脅的字元、執行許可權驗證等等。 SpringBoot 自動添加了 OrderedCharacterEncodingFilter 和 HiddenHttpMethodFilter, 並且可以自定義 Filter。 自定義 Filter 步驟: 實現 Filter 介面,實現 Filter 方法 新增 @Configuration 註解,將自定義 Filter 加入過濾鏈 (1)新建MyFilter類 public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request= (HttpServletRequest) servletRequest; System.out.println("this is MyFilter,url:"+request.getRequestURI()); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } } (2)將自定義 Filter 加入過濾鏈 @Configuration public class WebConfiguration { @Bean public RemoteIpFilter remoteIpFilter(){ return new RemoteIpFilter(); } /** * 訪問任意的 Url,都會看到控制檯列印如下資訊: * this is MyFilter,url :/xxxx * * 說明 MyFilter 已經對所有的 Url 進⾏行了監控,在實際使⽤用的過程中, * 常常利用這個特性進⾏行 session 驗證,判斷使用者是否登入。 * @return */ @Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean registrationBean=new FilterRegistrationBean(); registrationBean.setFilter(new MyFilter()); registrationBean.addUrlPatterns("/*"); registrationBean.addInitParameter("paramName","paramValue"); registrationBean.setName("MyFilter"); registrationBean.setOrder(1); return registrationBean; } }
4、自定義 Property
(1)在 Web 開發的過程中,自定義配置檔案 配置在 application.properties 中 com.kid.title=我是誰 com.kid.desc=我是中國人 (2)自定義配置類 @Component public class MyProperties { @Value("${com.kid.title}") private String title; @Value("${com.kid.desc}") private String desc; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } } (3)單元測試 @RunWith(SpringRunner.class) @SpringBootTest public class MyPropertiesTest { @Resource private MyProperties properties; @Test public void testMyProperties() throws Exception{ System.out.println("title:"+properties.getTitle()); System.out.println("desc:"+properties.getDesc()); } } 執行結果:title:我是誰 desc:我是中國人
小技巧:
如果測試中出現中文亂碼,可安裝以下方法進行設定:
依次單擊 File | Settings | Editor | File Encodings 命令,將 Properties Files (*.properties) 下的
Default encoding for properties files 設定為 UTF-8,將 Transparent native-to-ascii conversion
前的複選框勾選上。
總結:
Spring Boot 集成了引數校驗、內嵌容器、Restful、JSON 內容,這些技術在進行 Web 開發中必不可少。
Spring Boot 對這些技術進行了包裝,讓我們在 Web 專案開發過程中非常容易的使用這些技術,降低了開發
Web 專案的技術難度。