Springboot學習~5:Web開發介紹

簡介

使用SpringBoot;
1)、建立SpringBoot應用,選中咱們須要的模塊;
2)、SpringBoot已經默認將這些場景配置好了,只須要在配置文件中指定少許配置就能夠運行起來
3)、本身編寫業務代碼;css

自動配置原理?
這個場景SpringBoot幫咱們配置了什麼?能不能修改?能修改哪些配置?能不能擴展?xxxhtml

xxxxAutoConfiguration:幫咱們給容器中自動配置組件;
xxxxProperties:配置類來封裝配置文件的內容;

SpringBoot對靜態資源的映射規則

@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
public class ResourceProperties implements ResourceLoaderAware {
  //能夠設置和靜態資源有關的參數,緩存時間等
WebMvcAuotConfiguration:
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
                return;
            }
            Integer cachePeriod = this.resourceProperties.getCachePeriod();
            if (!registry.hasMappingForPattern("/webjars/**")) {
                customizeResourceHandlerRegistration(
                        registry.addResourceHandler("/webjars/**")
                                .addResourceLocations(
                                        "classpath:/META-INF/resources/webjars/")
                        .setCachePeriod(cachePeriod));
            }
            String staticPathPattern = this.mvcProperties.getStaticPathPattern();
            //靜態資源文件夾映射
            if (!registry.hasMappingForPattern(staticPathPattern)) {
                customizeResourceHandlerRegistration(
                        registry.addResourceHandler(staticPathPattern)
                                .addResourceLocations(
                                        this.resourceProperties.getStaticLocations())
                        .setCachePeriod(cachePeriod));
            }
        }

        //配置歡迎頁映射
        @Bean
        public WelcomePageHandlerMapping welcomePageHandlerMapping(
                ResourceProperties resourceProperties) {
            return new WelcomePageHandlerMapping(resourceProperties.getWelcomePage(),
                    this.mvcProperties.getStaticPathPattern());
        }

       //配置喜歡的圖標
        @Configuration
        @ConditionalOnProperty(value = "spring.mvc.favicon.enabled", matchIfMissing = true)
        public static class FaviconConfiguration {

            private final ResourceProperties resourceProperties;

            public FaviconConfiguration(ResourceProperties resourceProperties) {
                this.resourceProperties = resourceProperties;
            }

            @Bean
            public SimpleUrlHandlerMapping faviconHandlerMapping() {
                SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
                mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
                //全部  **/favicon.ico 
                mapping.setUrlMap(Collections.singletonMap("**/favicon.ico",
                        faviconRequestHandler()));
                return mapping;
            }

            @Bean
            public ResourceHttpRequestHandler faviconRequestHandler() {
                ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
                requestHandler
                        .setLocations(this.resourceProperties.getFaviconLocations());
                return requestHandler;
            }

        }

==1)、全部 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找資源;==
webjars:以jar包的方式引入靜態資源; http://www.webjars.org/
前端

localhost:8080/webjars/jquery/3.3.1/jquery.js:java

<!--引入jquery-webjar-->在訪問的時候只須要寫webjars下面資源的名稱便可
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>

==2)、"/**" 訪問當前項目的任何資源,都去(靜態資源的文件夾)找映射==mysql

"classpath:/META-INF/resources/", 
"classpath:/resources/",
"classpath:/static/", 
"classpath:/public/" 
"/":當前項目的根路徑

localhost:8080/abc === 去靜態資源文件夾裏面找abcjquery

==3)、歡迎頁; 靜態資源文件夾下的全部index.html頁面;被"/**"映射;==
​ localhost:8080/ 找index頁面web

==4)、全部的 **/favicon.ico 都是在靜態資源文件下找;==spring

本身定義靜態文件夾的路徑:
本身定義了以後,默認的靜態資源文件夾就不能使用了sql

JSON接口開發

在之前的項目中,使用JSON接口須要:數據庫

  1. 添加 jackjson 等相關 jar 包
  2. 配置 Spring Controller 掃描
  3. 對接的方法添加 @ResponseBody

Spring Boot只須要類添加 @RestController 便可,默認類中的方法都會以 json 的格式返回

@RestController
public class HelloController {
    @RequestMapping("/getUser")
    public User getUser() {
        User user=new User();
        user.setUserName("小明");
        user.setPassWord("xxxx");
        return user;
    }
}

若是須要使用頁面開發只要使用@Controller註解便可

自定義Filter

咱們經常在項目中會使用 filters 用於錄調用日誌、排除有 XSS 威脅的字符、執行權限驗證等等。Spring Boot 自動添加了 OrderedCharacterEncodingFilter 和 HiddenHttpMethodFilter,而且咱們能夠自定義 Filter。
兩個步驟:

  • 實現 Filter 接口,實現 Filter 方法
  • 添加@Configuration 註解,將自定義Filter加入過濾鏈
@Configuration
public class WebConfiguration {
    @Bean
    public RemoteIpFilter remoteIpFilter() {
        return new RemoteIpFilter();
    }
    
    @Bean
    public FilterRegistrationBean testFilterRegistration() {

        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new MyFilter());
        registration.addUrlPatterns("/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setName("MyFilter");
        registration.setOrder(1);
        return registration;
    }
    
    public class MyFilter implements Filter {
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
        }

        @Override
        public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
                throws IOException, ServletException {
            // TODO Auto-generated method stub
            HttpServletRequest request = (HttpServletRequest) srequest;
            System.out.println("this is MyFilter,url :"+request.getRequestURI());
            filterChain.doFilter(srequest, sresponse);
        }

        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
        }
    }
}

自定義 Property

  1. 配置在 application.properties 中
  2. 自定義配置類
@Component
public class NeoProperties {
    @Value("${com.neo.title}")
    private String title;
    @Value("${com.neo.description}")
    private String description;

    //省略getter settet方法

    }

log配置

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

path 爲本機的 log 地址,logging.level 後面能夠根據包路徑配置不一樣資源的 log 級別

數據庫操做

添加 jar 包:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

添加配置文件:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true

添加實體類和 Dao:

@Entity
public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    private Long id;
    @Column(nullable = false, unique = true)
    private String userName;
    @Column(nullable = false)
    private String passWord;
    @Column(nullable = false, unique = true)
    private String email;
    @Column(nullable = true, unique = true)
    private String nickName;
    @Column(nullable = false)
    private String regTime;

    //省略getter settet方法、構造方法

}

dao 只要繼承 JpaRepository 類就能夠,幾乎能夠不用寫方法,
能夠根據方法名來自動的生成 SQL,好比findByUserName 會自動生成一個以 userName 爲參數的查詢方法,好比 findAlll 自動會查詢表裏面的全部數據,好比自動分頁等等。

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

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

測試:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class UserRepositoryTests {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void test() throws Exception {
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);        
        String formattedDate = dateFormat.format(date);
        
        userRepository.save(new User("aa1", "aa@126.com", "aa", "aa123456",formattedDate));
        userRepository.save(new User("bb2", "bb@126.com", "bb", "bb123456",formattedDate));
        userRepository.save(new User("cc3", "cc@126.com", "cc", "cc123456",formattedDate));

        Assert.assertEquals(9, userRepository.findAll().size());
        Assert.assertEquals("bb", userRepository.findByUserNameOrEmail("bb", "cc@126.com").getNickName());
        userRepository.delete(userRepository.findByUserName("aa1"));
    }

}

Spring Data Jpa 還有不少功能,好比封裝好的分頁,能夠本身定義 SQL,主從分離等等

Thymeleaf 模板

Thymeleaf 是一款用於渲染 XML/XHTML/HTML5 內容的模板引擎。相似 JSP,Velocity,FreeMaker 等,它也能夠輕易的與 Spring MVC 等 Web 框架進行集成做爲 Web 應用的模板引擎。與其它模板引擎相比,Thymeleaf 最大的特色是可以直接在瀏覽器中打開並正確顯示模板頁面,而不須要啓動整個 Web 應用。

Thymeleaf 是不同凡響的,由於它使用了天然的模板技術。這意味着 Thymeleaf 的模板語法並不會破壞文檔的結構,模板依舊是有效的XML文檔。模板還能夠用做工做原型,Thymeleaf 會在運行期替換掉靜態值。Velocity 與 FreeMarke r則是連續的文本處理器。 下面的代碼示例分別使用 Velocity、FreeMarker 與 Thymeleaf 打印出一條消息:

Velocity: <p>$message</p>
FreeMarker: <p>${message}</p>
Thymeleaf: <p th:text="${message}">Hello World!</p>

注意,因爲 Thymeleaf 使用了 XML DOM 解析器,所以它並不適合於處理大規模的 XML 文件。

引入webjars:

頁面即原型

在 Web 開發過程當中一個繞不開的話題就是前端工程師與後端工程師的協做,在傳統 Java Web 開發過程當中,前端工程師和後端工程師同樣,也須要安裝一套完整的開發環境,而後各種 Java IDE 中修改模板、靜態資源文件,啓動/重啓/從新加載應用服務器,刷新頁面查看最終效果。

但實際上前端工程師的職責更多應該關注於頁面自己而非後端,使用 JSP,Velocity 等傳統的 Java 模板引擎很難作到這一點,由於它們必須在應用服務器中渲染完成後才能在瀏覽器中看到結果,而 Thymeleaf 從根本上顛覆了這一過程,經過屬性進行模板渲染不會引入任何新的瀏覽器不能識別的標籤,例如 JSP 中的 ,不會在 Tag 內部寫表達式。整個頁面直接做爲 HTML 文件用瀏覽器打開,幾乎就能夠看到最終的效果,這大大解放了前端工程師的生產力,它們的最終交付物就是純的 HTML/CSS/JavaScript 文件。

引入Thymeleaf

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
切換thymeleaf版本
<properties>
    <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
    <!-- 佈局功能的支持程序  thymeleaf3主程序  layout2以上版本 -->
    <!-- thymeleaf2   layout1-->
    <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
  </properties>

Thymeleaf使用

@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {

    private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");

    private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");

    public static final String DEFAULT_PREFIX = "classpath:/templates/";

    public static final String DEFAULT_SUFFIX = ".html";
    //

只要咱們把HTML頁面放在classpath:/templates/,thymeleaf就能自動渲染;

  1. 導入thymeleaf的名稱空間
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  1. 使用thymeleaf語法;
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>成功!</h1>
    <!--th:text 將div裏面的文本內容設置爲 -->
    <div th:text="${hello}">這是顯示歡迎信息</div>
</body>
</html>
相關文章
相關標籤/搜索