如入门般建立项目,引入依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-test</artifactId>
  10. <scope>test</scope>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-devtools</artifactId>
  15. <optional>true</optional>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.projectlombok</groupId>
  19. <artifactId>lombok</artifactId>
  20. <optional>true</optional>
  21. </dependency>
  22. </dependencies>
  23.  
  24. <build>
  25. <plugins>
  26. <plugin>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-maven-plugin</artifactId>
  29. </plugin>
  30. </plugins>
  31. </build>

编写代码Controller:

  1. @RestController
  2. public class UserController {
  3.  
  4. @RequestMapping("user/getUser")
  5. public User getUserInfo() {
  6. try {
  7. User user = (User) ModelBuilders.bulid(User.class);
  8. user.setUsername("朱XPHB明");
  9. user.setPassword("AG8xph0b271");
  10. user.setAddress("世纪汇广场");
  11. return user;
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. }
  15. return null;
  16. }
  17. }

entity:使用了lombok

  1. package springboot_webdemo.entity;
  2.  
  3. import lombok.Getter;
  4. import lombok.Setter;
  5.  
  6. public class User {
  7.  
  8. @Getter
  9. @Setter
  10. private String username;
  11.  
  12. @Getter
  13. @Setter
  14. private String password;
  15.  
  16. @Getter
  17. @Setter
  18. private String address;
  19. }

bulider

  1. public class ModelBuilders {
  2.  
  3. public static Object bulid(Class clz) throws Exception, IllegalAccessException{
  4.  
  5. Object instance = clz.newInstance();
  6. return instance;
  7. }
  8.  
  9. }

运行效果:自动返回json格式use信息数据

  1. {"username":"朱XPHB明","password":"AG8xph0b271","address":"世纪汇广场"}

自定义Filter

我们常常在项目中会使用filters用于录调用日志、排除有XSS威胁的字符、执行权限验证等等。Spring Boot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,并且我们可以自定义Filter。

两个步骤:

  1. 实现Filter接口,实现Filter方法

  2. 添加@Configuration 注解,将自定义Filter加入过滤链

代码如下:

  1. public class InterfaceCostFilter implements Filter{
  2.  
  3. @Override
  4. public void init(FilterConfig filterConfig) throws ServletException {
  5.  
  6. }
  7.  
  8. @Override
  9. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  10. throws IOException, ServletException {
  11. long benginTime = System.currentTimeMillis();
  12. chain.doFilter(request, response);
  13. long endTime = System.currentTimeMillis();
  14. long cost = endTime - benginTime;
  15. System.out.println("InterfaceCostFilter记录本次调用服务花费时间:"+cost+"ms");
  16. }
  17.  
  18. @Override
  19. public void destroy() {
  20.  
  21. }
  22.  
  23. }

加入过滤器链

  1. @Configuration
  2. public class FilterConfig {
  3.  
  4. //应用程序运行在一台负载均衡代理服务器后方,因此需要将代理服务器发来的请求包含的IP地址转换成真正的用户IP。
  5. //Tomcat 8 提供了对应的过滤器:RemoteIpFilter
  6. @Bean
  7. public RemoteIpFilter remoteIpFilter(){
  8. return new RemoteIpFilter();
  9. }
  10.  
  11. @Bean
  12. public FilterRegistrationBean<Filter> getInterfaceCostFilter(){
  13.  
  14. FilterRegistrationBean registrationBean = new FilterRegistrationBean ();
  15. registrationBean.setFilter(new InterfaceCostFilter());
  16. registrationBean.addUrlPatterns("/*");
  17. registrationBean.addInitParameter("nickname", "王小二");//添加默认参数
  18. registrationBean.setName("InterfaceCostFilter");
  19. registrationBean.setOrder(1);
  20. return registrationBean;
  21. }
  22. }

添加一个获取拦截器信息参数的Controller,registration可以拿到拦截器的信息

  1. @RestController
  2. public class FilterController {
  3.  
  4. @Autowired
  5. FilterRegistrationBean registration;
  6.  
  7. @RequestMapping("filter/getFilterParam")
  8. public Map<String,String> getUserInfo() {
  9. try {
  10. Map<String,String> map = registration.getInitParameters();
  11. // Filter filter = registration.getFilter();
  12. String nickname = (String) map.get("nickname");
  13. return map;
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. }
  17. return null;
  18. }
  19. }

执行结果1:

InterfaceCostFilter记录本次调用服务花费时间:3ms

执行结果2:

InterfaceCostFilter记录本次调用服务花费时间:1ms

注解版filter实现

  1. @WebFilter(urlPatterns="/*",filterName="InterfaceCostFilterByAnno",initParams={@WebInitParam(name="age",value="21"),
  2. @WebInitParam(name = "charSet", value = "utf-8")})
  3. public class InterfaceCostFilterByAnno implements Filter{
  4.  
  5. @Override
  6. public void init(FilterConfig filterConfig) throws ServletException {
  7.  
  8. }
  9.  
  10. @Override
  11. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  12. throws IOException, ServletException {
  13. long benginTime = System.currentTimeMillis();
  14. chain.doFilter(request, response);
  15. long endTime = System.currentTimeMillis();
  16. long cost = endTime - benginTime;
  17. System.out.println("InterfaceCostFilterByAnno记录本次调用"+"服务花费时间:"+cost+"ms");
  18. }
  19.  
  20. @Override
  21. public void destroy() {
  22.  
  23. }
  24.  
  25. }

springboot启动类添加注解

  1. @SpringBootApplication
  2. @ServletComponentScan("springboot_webdemo.filter")
  3. public class App {
  4.  
  5. public static void main(String[] args) throws Exception {
  6. SpringApplication.run(App.class, args);
  7. }
  8.  
  9. }

FilterConfig中添加@Primary

  1. @Bean
  2. @Primary
  3. public FilterRegistrationBean<InterfaceCostFilter> getInterfaceCostFilter(){
  4.  
  5. FilterRegistrationBean registrationBean = new FilterRegistrationBean ();
  6. registrationBean.setFilter(new InterfaceCostFilter());
  7. registrationBean.addUrlPatterns("/*");
  8. registrationBean.addInitParameter("nickname", "王小二");//添加默认参数
  9. registrationBean.setName("InterfaceCostFilter");
  10. registrationBean.setOrder(1);
  11. return registrationBean;
  12. }

测试:

InterfaceCostFilterByAnno记录本次调用服务花费时间:3ms

InterfaceCostFilter记录本次调用服务花费时间:3ms

InterfaceCostFilterByAnno记录本次调用服务花费时间:2ms

InterfaceCostFilter记录本次调用服务花费时间:2ms

返回的是加@Primary的值

不建议使用注解

多个过滤器实现

  1. @Configuration
  2. public class FilterConfig {
  3.  
  4. //应用程序运行在一台负载均衡代理服务器后方,因此需要将代理服务器发来的请求包含的IP地址转换成真正的用户IP。
  5. //Tomcat 8 提供了对应的过滤器:RemoteIpFilter
  6. @Bean
  7. public RemoteIpFilter remoteIpFilter(){
  8. return new RemoteIpFilter();
  9. }
  10.  
  11. @Bean
  12. // @Primary
  13. public FilterRegistrationBean<InterfaceCostFilter> getInterfaceCostFilter(){
  14.  
  15. FilterRegistrationBean registrationBean = new FilterRegistrationBean ();
  16. registrationBean.setFilter(new InterfaceCostFilter());
  17. registrationBean.addUrlPatterns("/*");
  18. registrationBean.addInitParameter("nickname", "王小二");//添加默认参数
  19. registrationBean.setName("InterfaceCostFilter");
  20. registrationBean.setOrder(2);
  21. return registrationBean;
  22. }
  23.  
  24. @Bean
  25. @Primary
  26. public FilterRegistrationBean<Filter> interfaceCostFilterByAnno(){
  27.  
  28. FilterRegistrationBean registrationBean = new FilterRegistrationBean ();
  29. registrationBean.setFilter(new InterfaceCostFilterByAnno());
  30. registrationBean.addUrlPatterns("/*");
  31. registrationBean.addInitParameter("nickname", "王小二");//添加默认参数
  32. registrationBean.addInitParameter("age", "张三");//添加默认参数
  33. registrationBean.setName("interfaceCostFilterByAnno");
  34. registrationBean.setOrder(1);
  35. return registrationBean;
  36. }

多个过滤器先执行order小的,

  1. @Primary注入FilterRegistrationBean的时候注入,也可以使用别名注入

日志添加

log配置

配置输出的地址和输出级别

logging.path=D:/user/local/log
logging.level.springboot_webdemo=DEBUG
logging.level.org.springframework.web=INFO
logging.level.org.hibernate=ERROR

path为本机的log地址,logging.level 后面可以根据包路径配置不同资源的log级别

代码中使用日志:lombok提供支持

  1. @RestController
  2. @Slf4j
  3. public class UserController {
  4.  
  5. @RequestMapping("user/getUser")
  6. public User getUserInfo() {
  7. try {
  8. User user = (User)ModelBuilders.bulid(User.class);
  9. user.setUsername("朱XPHB明");
  10. user.setPassword("AG8xph0b271");
  11. user.setAddress("世纪汇广场");
  12. log.info("user={}",user.toString());
  13. return user;
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. }
  17. return null;
  18. }
  19. }

运行访问:

20-05-02 17:14:29.269  INFO 8188 --- [nio-8080-exec-1] s.controller.UserController              : user=User [username=朱XPHB明, password=AG8xph0b271, address=世纪汇广场]

@RestController@Slf4jpublic class UserController {@RequestMapping("user/getUser")public User getUserInfo() {try {User user = (User)ModelBuilders.bulid(User.class);user.setUsername("朱XPHB明");user.setPassword("AG8xph0b271");user.setAddress("世纪汇广场");log.info("user={}",user.toString());return user;} catch (Exception e) {e.printStackTrace();}return null;}}

自定义Property

在web开发的过程中,我经常需要自定义一些配置文件,如何使用呢

配置在application.properties中

com.lf.title=自定义属性
com.lf.description=自定义属性描述

代码中获取属性值

  1. @Component
  2. @Data
  3. public class CommonProperties {
  4.  
  5. @Value("${com.lf.title}")
  6. private String title;
  7.  
  8. @Value("${com.lf.description}")
  9. private String description;
  10.  
  11. }

Controller

  1. @Slf4j
  2. @RestController
  3. public class PropertiesController {
  4.  
  5. @Autowired
  6. private CommonProperties commonProperties;
  7.  
  8. @RequestMapping("/getProperties")
  9. public CommonProperties getCommonProperties(){
  10. log.info("commonProperties={}",commonProperties.getTitle());
  11. return commonProperties;
  12. }
  13. }

访问:

关于读取配置乱码

java读properties文件的时候,只认识ascii码,如\u4e2d这种,不认识汉字 。

STS --https://blog.csdn.net/gjm15652957971/article/details/80311714

IDEA--

先修改properties文件的编码格式

修改为utf-8,同时去Idea里面修改properties编码设置:
Settings ——》Editor ——》 File Encodings
选择UTF-8,同时勾选Transparent native-to-ascii conversion,如下图

数据库操作

spring data jpa的使用

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. spring.jpa.properties.hibernate.hbm2ddl.auto=update
  6. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
  7. 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

改造原有User类

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

  1. @Table(name="lf_user")
    @Entity
  2. public class User implements Serializable{
  3. @Id
  4. @GeneratedValue
  5. @Getter
  6. @Setter
  7. private Long id;
  8. @Getter
  9. @Setter
  10. @Column(nullable = false, unique = true)
  11. private String username;
  12.  
  13. @Getter
  14. @Setter
  15. private String password;
  16.  
  17. @Getter
  18. @Setter
  19. private String address;

dao只要继承JpaRepository

  1. public interface UserRepository extends JpaRepository<User, Long> {
  2.  
  3. User findByUsername(String username);
  4.  
  5. User findByUsernameOrAddress(String username, String address);
  6.  
  7. List<User> findAll();
  8. }

service

  1. @Service
  2. public class UserService implements IUserService{
  3.  
  4. @Autowired
  5. private UserRepository userRepository;
  6.  
  7. @Override
  8. public User findByUsername(String username) {
  9.  
  10. return userRepository.findByUsername(username);
  11. }
  12.  
  13. @Override
  14. public User findByUsernameOrAddress(String username, String address) {
  15.  
  16. return userRepository.findByUsernameOrAddress(username, address);
  17. }
  18.  
  19. @Override
  20. public List<User> findAll() {
  21. return userRepository.findAll();
  22. }
  23.  
  24. }

controller

  1. @RequestMapping("user/getAllUser")
  2. public List<User> getAllUser() {
  3. try {
  4. List<User> userlist = userService.findAll();
  5. log.info("user={}",userlist.size());
  6. return userlist;
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }
  10. return null;
  11. }

4、测试

数据库中手动插入了两条数据,用findAlL方法成功查询返回。

代码链接:https://github.com/FLGBetter/springboot_webdemo

springboot demo(二)web开发demo的更多相关文章

  1. Spring入门(二):SpringBoot之基础Web开发

    接上回 现在,我们已经能自行完成SpringBoot的初级项目搭建了,接下来看如何实现一些Web开发中的基础功能. 先看项目完整的目录结构: 1. 返回Json数据 创建model文件夹,并新建Per ...

  2. 浩顺AC671指纹考勤机二次开发(demo)

    关于考勤机 AC671,是新换的机器,以前的那部机器,通过网络死活连接不上,换了AC671网络连接是好用了.但是,我要吐槽 浩顺的考勤机应该是卖了很多了吧,可是自带的软件太不给力,最后分析出来的数据一 ...

  3. SpringBoot起飞系列-Web开发(四)

    一.前言 从今天你开始我们就开始进行我们的web开发,之前的一篇用SpringBoot起飞系列-使用idea搭建环境(二)已经说明了我们如何进行开发,当然这是搭建起步,接下来我们就开始进行详细的开发, ...

  4. Struts2技术内幕 读书笔记二 web开发的基本模式

    最佳实践 在讨论基本模式之前,我们先说说一个词:最佳实践 任何程序的编写都得遵循一个特定的规范.这种规范有约定俗称的例如:包名全小写,类名每个单词第一个字母大写等等等等;另外还有一些需要我们严格遵守的 ...

  5. springboot核心技术(三)-----web开发

    web开发 1.简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运 ...

  6. 百度地图二次开发Demo

    单点标注:电子显示对应位置的图片,信息框 多点标注(批量点标注): 多点连线(基于多个点形成路径): 若须要Demo源码:请给我发邮箱 1507026255@qq.com 转载请注明小刘

  7. Springboot学习:Web开发介绍

    简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 3).自 ...

  8. 六十二 Web开发 使用模板

    Web框架把我们从WSGI中拯救出来了.现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了. 但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要.在函数中返回一 ...

  9. Spring基础系列-Web开发

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996902.html SpringBoot基础系列-web开发 概述 web开发就是集成 ...

随机推荐

  1. PAT练习num1-害死人补偿命的3n+1猜想

    卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 年的世界 ...

  2. MySQL全面瓦解21(番外):一次深夜优化亿级数据分页的奇妙经历

    背景 1月22号晚上10点半,下班后愉快的坐在在回家的地铁上,心里想着周末的生活怎么安排. 突然电话响了起来,一看是我们的一个开发同学,顿时紧张了起来,本周的版本已经发布过了,这时候打电话一般来说是线 ...

  3. hessian-serialization

    http://hessian.caucho.com/doc/hessian-serialization.html Table of Contents 1.  Introduction2.  Desig ...

  4. 回归测试_百度百科 https://baike.baidu.com/item/%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95

    回归测试_百度百科https://baike.baidu.com/item/%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95

  5. cpp异常机制思考

    https://www.cnblogs.com/qq329914874/p/6734701.html

  6. WPF学习里程(二) XAML基础

    1.什么是XAML? 官方语言: XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序标记语言,它是微软公司为构建应用程序用 ...

  7. Fastjson使用实例

    Fastjson使用实例 一.FastJson使用范例 1.1FastJson三个核心类 1.2Maven依赖 1.3Scala API 1.3.1反序列化 1.3.2序列化 1.4Java API ...

  8. 封装各种生成唯一性ID算法的工具类

    /** * Copyright (c) 2005-2012 springside.org.cn * * Licensed under the Apache License, Version 2.0 ( ...

  9. 用hyper-v创建虚拟机

    1.新建虚拟机 1) 2) 3) 4)一般情况:linux选择第一代,Windows选择第二代 5) 6) 7) 8) 9) 10) 11)网卡设置:如果虚拟机和宿主机公用一块网卡,那么VLAN ID ...

  10. 简述vue-cli 2.x和vue-cli 3+在项目构建、运行、编译执行时的区别

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14363272.html 关于VUE的项目,有个问题一直不是特别清楚 ,不同公司的项目 ...