zoukankan      html  css  js  c++  java
  • 二、web综合开发

    spring boot web开发非常的简单,其中包括常用的json输出、filters、property、log等。

    1.json接口开发

    在以前的spring 开发的时候需要我们提供json接口的时候需要做那些配置呢

    1. 添加 jackjson 等相关jar包

    2. 配置spring controller扫描

    3. 对接的方法添加@ResponseBody

    就这样我们会经常由于配置错误,导致406错误等等,spring boot如何做呢,只需要类添加 @RestController 即可,默认类中的方法都会以json的格式返回

    package com.example.demo.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.example.demo.domain.User;
    
    @RestController
    public class HelloWorldController {
        @RequestMapping("/hello")
        public String index(){
            return "Hello World";
        }
        @RequestMapping("/getUser")
        public User getUser(){
            User user = new User();
            user.setId(1);
            user.setUserName("David");
            user.setPassWord("123456");
            user.setRegTime("regTime");
            return user;
        }
    }

    localhost:8080/getUser

    2.自定义Filter

    两个步骤:1.实现Filter接口,实现doFilter方法。 2.将自定义的过滤器加入过滤链。

    package com.example.demo.filter;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.catalina.filters.RemoteIpFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @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
                Filter.super.destroy();
            }
    
            @Override
            public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
                    throws IOException, ServletException {
                HttpServletRequest request = (HttpServletRequest) srequest; 
                System.out.println("this is MyFilter, url :" + request.getRequestURI());
                filterChain.doFilter(srequest, sresponse);
            }
            
            @Override
            public void init(FilterConfig filterConfig) throws ServletException {
                // TODO Auto-generated method stub
                Filter.super.init(filterConfig);
            }
        }
    }

    3.自定义property

    在application.properties中配置

    com.example.demo.title=u6797u5E73u4E4B
    com.example.demo.description=u5251u672Fu5DF2u6210

    如何使用呢?新建配置类:

    package com.example.demo.prop;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Component
    public class NeoProperties {
        @Value("${com.example.demo.title}")
        private String title;
        @Value("${com.example.demo.description}")
        private String description;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
    }

    log配置:

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

    题外话:log级别

      Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来,也是说大于等于的级别的日志才输出。

      日志记录的级别有继承性,子类会记录父类的所有的日志级别。

      logger日志设置:

      1、加包:log4j-1.2.16.jar  一般还会加入 commons-logging-1.1.1.jar

      2、在CLASSPATH 下建立log4j.properties

      在要输出的日志的类中

      定义:private static final org.apache.log4j.Logger logger = Logger.getLogger(类名.class);

      在类输位置:logger.info(XXX);

    4.数据库操作

    spring data jpa的使用,jpa是利用Hibernate生成各种自动化的sql,如果只是简单的增删改查,基本上不用手写了,spring内部已经帮大家封装实现了。

    1.添加依赖

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

    2.添加配置

    spring.datasource.url=jdbc:mysql://localhost:3306/ffdu?serverTimezone=GMT%2B8
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    spring.jpa.properties.hibernate.hbm2ddl.auto=update
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
    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

    /**
     * 
     */
    /**
     * @author HP
     *
     */
    package com.example.demo.domain;
    
    import java.io.Serializable;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class User implements Serializable {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue
        private Integer id;
        @Column(nullable = false, unique = true)
        private String userName;
        @Column(nullable = false)
        private String passWord;
        @Column(nullable = true, unique = true)
        private String email;
        @Column(nullable = true, unique = true)
        private String nickName;
        @Column(nullable = false)
        private String regTime;
        
        public User(){}
        
        public User(String userName, String passWord, String email, String nickName, String regTime) {
            this.userName = userName;
            this.passWord = passWord;
            this.email = email;
            this.nickName = nickName;
            this.regTime = regTime;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getPassWord() {
            return passWord;
        }
    
        public void setPassWord(String passWord) {
            this.passWord = passWord;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getNickName() {
            return nickName;
        }
    
        public void setNickName(String nickName) {
            this.nickName = nickName;
        }
    
        public String getRegTime() {
            return regTime;
        }
    
        public void setRegTime(String regTime) {
            this.regTime = regTime;
        }
    
        public static long getSerialversionuid() {
            return serialVersionUID;
        }
    
    }

    Entity中不映射成列的字段需要加@Transient注解,不加注解也会映射成列。

    package com.example.demo.domain;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface UserRepository extends JpaRepository<User, Long> {
        User findByUserName(String userName);
    
        User findByUserNameOrEmail(String userName, String email);
    }

    5.测试

    package com.example.demo;
    
    import static org.junit.Assert.*;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.junit.Assert;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.example.demo.domain.User;
    import com.example.demo.domain.UserRepository;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = DemoApplication.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("ffdu", "123456", "aa@126.com", "阿飞", formattedDate));
           
           //Assert.assertEquals(9, userRepository.findAll().size());
           //Assert.assertEquals("bb", userRepository.findByUserNameOrEmail("bb", "cc@126.com").getNickName());
           //userRepository.delete(userRepository.findByUserName("ffdu"));
       }
    }

  • 相关阅读:
    [转载红鱼儿]delphi 实现微信开发(1)
    Devexpress VCL Build v2013 vol 14.1.3 发布
    [翻译]LSP程序的分类
    睡眠不好
    LuaStudio 9.27 去10分钟退出暗桩板
    vs2012 提示 未能正确加载 "Visual C++ Language Manager Package" 包 的解决办法
    岁月蹉跎
    重新安装系统之前备份
    运动会
    乱思
  • 原文地址:https://www.cnblogs.com/oath-keeper/p/10550033.html
Copyright © 2011-2022 走看看