1. 程式人生 > >Web快速開發(二)

Web快速開發(二)

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 專案的技術難度。