1. 程式人生 > >Spring boot(二)—Web開發

Spring boot(二)—Web開發

final 一次 org init 調用 mat 重要 映射 ppi

上篇文章介紹了Spring boot初級教程:spring boot(一):入門篇,方便大家快速入門、了解實踐Spring boot特性;本篇文章接著上篇內容繼續為大家介紹spring boot的其它特性(有些未必是spring boot體系桟的功能,但是是spring特別推薦的一些開源技術本文也會介紹)。

1.Web開發

spring boot web開發非常的簡單,其中包括常用的json輸出、filters、property、log等。

2.Json接口開發

在以前的spring 開發的時候需要我們提供json接口的時候需要做那些配置呢?大概有以下配置:

(1)添加Jackjson等相關jar包;

(2)配置Spring Controller掃描;

(3)對接的方法添加@ResponseBody;

就這樣我們會經常由於配置錯誤,導致406錯誤等等,spring boot如何做呢,只需要類添加 @RestController 即可,默認類中的方法都會以json的格式返回。

 1 @RestController
 2 public class HelloWorldController {
 3     @RequestMapping("/getUser")
 4     public User getUser() {
 5         User user=new User();
 6
user.setUserName("小明"); 7 user.setPassWord("xxxx"); 8 return user; 9 } 10 }

如果我們需要使用頁面開發只要使用@Controller ,下面會結合模板來說明

3.自定義Filter

我們常常在項目中會使用filters用於錄調用日誌、排除有XSS威脅的字符、執行權限驗證等等。Spring Boot自動添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,並且我們可以自定義Filter。

兩個步驟:

(1)實現Filter接口,實現Filter方法;

(2)添加@Configurationz 註解,將自定義Filter加入過濾鏈;

代碼如下:

 1 @Configuration
 2 public class WebConfiguration {
 3     @Bean
 4     public RemoteIpFilter remoteIpFilter() {
 5         return new RemoteIpFilter();
 6     }
 7     
 8     @Bean
 9     public FilterRegistrationBean testFilterRegistration() {
10 
11         FilterRegistrationBean registration = new FilterRegistrationBean();
12         registration.setFilter(new MyFilter());
13         registration.addUrlPatterns("/*");
14         registration.addInitParameter("paramName", "paramValue");
15         registration.setName("MyFilter");
16         registration.setOrder(1);
17         return registration;
18     }
19     
20     public class MyFilter implements Filter {
21         @Override
22         public void destroy() {
23             // TODO Auto-generated method stub
24         }
25 
26         @Override
27         public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
28                 throws IOException, ServletException {
29             // TODO Auto-generated method stub
30             HttpServletRequest request = (HttpServletRequest) srequest;
31             System.out.println("this is MyFilter,url :"+request.getRequestURI());
32             filterChain.doFilter(srequest, sresponse);
33         }
34 
35         @Override
36         public void init(FilterConfig arg0) throws ServletException {
37             // TODO Auto-generated method stub
38         }
39     }
40 }

4.自定義Property

在web開發的過程中,我經常需要自定義一些配置文件,如何使用呢?

(1)配置在application.properties中:

com.neo.title=純潔的微笑

com.neo.description=分享生活和技術

(2)自定義配置類:

 1 @Component
 2 public class NeoProperties {
 3     @Value("${com.neo.title}")
 4     private String title;
 5     @Value("${com.neo.description}")
 6     private String description;
 7 
 8     //省略getter settet方法
 9 
10     }

5.log配置

配置輸出的地址和輸出級別

1 logging.path=/user/local/log
2 logging.level.com.favorites=DEBUG
3 logging.level.org.springframework.web=INFO
4 logging.level.org.hibernate=ERROR

path為本機的log地址,logging.level 後面可以根據包路徑配置不同資源的log級別。

6.數據庫操作

在這裏我重點講述mysql、spring data jpa的使用,其中mysql 就不用說了大家很熟悉,jpa是利用Hibernate生成各種自動化的sql,如果只是簡單的增刪改查,基本上不用手寫了,spring內部已經幫大家封裝實現了。

下面簡單介紹一下如何在spring boot中使用:

(1)添加相關jar包

1  <dependency>
2         <groupId>org.springframework.boot</groupId>
3         <artifactId>spring-boot-starter-data-jpa</artifactId>
4     </dependency>
5      <dependency>
6         <groupId>mysql</groupId>
7         <artifactId>mysql-connector-java</artifactId>
8     </dependency>

(2)添加配置文件

1 spring.datasource.url=jdbc:mysql://localhost:3306/test
2 spring.datasource.username=root
3 spring.datasource.password=root
4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
5 
6 spring.jpa.properties.hibernate.hbm2ddl.auto=update
7 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
8 spring.jpa.show-sql= true

其實這個hibernate.hbm2ddl.auto參數的作用主要用於:自動創建|更新|驗證數據庫表結構,有四個值:

  1. create: 每次加載hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致數據庫表數據丟失的一個重要原因。
  2. create-drop :每次加載hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
  3. update:最常用的屬性,第一次加載hibernate時根據model類會自動建立起表的結構(前提是先建立好數據庫),以後加載hibernate時根據 model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要註意的是當部署到服務器後,表結構是不會被馬上建立起來的,是要等 應用第一次運行起來後才會。
  4. validate :每次加載hibernate時,驗證創建數據庫表結構,只會和數據庫中的表進行比較,不會創建新表,但是會插入新值。

dialect 主要是指定生成表名的存儲引擎為InneoDB;
show-sql 是否打印出自動生產的SQL,方便調試的時候查看;

(3)添加實體類和DAO包

 1 @Entity
 2 public class User implements Serializable {
 3 
 4     private static final long serialVersionUID = 1L;
 5     @Id
 6     @GeneratedValue
 7     private Long id;
 8     @Column(nullable = false, unique = true)
 9     private String userName;
10     @Column(nullable = false)
11     private String passWord;
12     @Column(nullable = false, unique = true)
13     private String email;
14     @Column(nullable = true, unique = true)
15     private String nickName;
16     @Column(nullable = false)
17     private String regTime;
18 
19     //省略getter settet方法、構造方法
20 
21 }

dao只要繼承JpaRepository類就可以,幾乎可以不用寫方法,還有一個特別有尿性的功能非常贊,就是可以根據方法名來自動的生產SQL,比如findByUserName 會自動生產一個以 userName 為參數的查詢方法,比如 findAlll 自動會查詢表裏面的所有數據,

比如自動分頁等等。。

**Entity中不映射成列的字段得加@Transient 註解,不加註解也會映射成列**

1 public interface UserRepository extends JpaRepository<User, Long> {
2     User findByUserName(String userName);
3     User findByUserNameOrEmail(String username, String email);

7.測試

 1 @RunWith(SpringJUnit4ClassRunner.class)
 2 @SpringApplicationConfiguration(Application.class)
 3 public class UserRepositoryTests {
 4 
 5     @Autowired
 6     private UserRepository userRepository;
 7 
 8     @Test
 9     public void test() throws Exception {
10         Date date = new Date();
11         DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);        
12         String formattedDate = dateFormat.format(date);
13         
14         userRepository.save(new User("aa1", "[email protected]", "aa", "aa123456",formattedDate));
15         userRepository.save(new User("bb2", "[email protected]", "bb", "bb123456",formattedDate));
16         userRepository.save(new User("cc3", "[email protected]", "cc", "cc123456",formattedDate));
17 
18         Assert.assertEquals(9, userRepository.findAll().size());
19         Assert.assertEquals("bb", userRepository.findByUserNameOrEmail("bb", "[email protected]").getNickName());
20         userRepository.delete(userRepository.findByUserName("aa1"));
21     }
22 
23 }

當讓 spring data jpa 還有很多功能,比如封裝好的分頁,可以自己定義SQL,主從分離等等,這裏就不詳細講了。。。

END

Spring boot(二)—Web開發