当前位置: 首页 > news >正文

用dw做的企业网站做百度网站还是安居客网站

用dw做的企业网站,做百度网站还是安居客网站,中国十大电商排行榜,北京网页设计公司济南兴田德润简介图片SpringBoot 是整合 Spring 技术栈的一站式框架#xff0c;是简化 Spring 技术栈的快速开发脚手架约定大于配置 文章目录一 概述1 第一个 SpringBoot 项目2 SpringBoot 特性#xff1a;依赖管理3 SpringBoot 特性#xff1a;自动配置二 SpringBoot 的 IOC容器1 组件添加…SpringBoot 是整合 Spring 技术栈的一站式框架是简化 Spring 技术栈的快速开发脚手架约定大于配置 文章目录一 概述1 第一个 SpringBoot 项目2 SpringBoot 特性依赖管理3 SpringBoot 特性自动配置二 SpringBoot 的 IOC容器1 组件添加Configuration2 组件添加Import3 组件添加Conditional4 引入原生配置文件ImportResource5 配置绑定ConfigurationProperties6 Lombok 的使用三 yaml 配置文件1 基本语法2 使用示例3 添加配置提示自动补全四 实例后端管理系统1 静态资源的配置与访问2 配置控制器3 Thymeleaf 抽取页面的相同元素4 配置拦截器5 文件上传6 错误处理五 注入原生 Web 组件ServletFilterListener1 使用 Servlet API推荐2 使用 RegistrationBean六 数据访问1 导入 JDBC 场景2 切换 Druid 数据源3 整合 MyBatis七 单元测试1 JUnit52 常用注解3 断言 assert4 假设 assumption5 嵌套测试八 指标监控1 开启方法2 常用端点一 概述 1 第一个 SpringBoot 项目 导入 maven 依赖 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.6.3/version/parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies创建主程序类作为启动的入口注意启动类的目录一定要在 controller 等目录的至少上一级或者在 SpringBootApplication 注解中添加 scanBasePackages 属性 SpringBootApplication(scanBasePackages controller) public class HelloApplication {public static void main(String[] args) {SpringApplication.run(HelloApplication.class, args);} }创建控制器类以及控制器方法RestController ResponseBody Controller用于标注控制器类该控制器的 所有方法 向浏览器返回 控制器方法的返回值 RestController // RestController ResponseBody Controller向浏览器返回 该方法的返回值 public class HelloController {RequestMapping(/hello)public String hello() {return hello springboot;} }运行主程序类的 main 方法即可无需更多配置 如果要修改某些配置在 resources/application.properties 中修改即可如server.port8888 如果要导出为 jar 包需要在 maven 配置文件中添加 buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build并执行 maven 的 clean package 操作 2 SpringBoot 特性依赖管理 自定义的 SpringBoot 项目的父项目 spring-boot-starter-parent实现了依赖管理功能父项目的父项目 spring-boot-dependencies 的 properties 标签声明了几乎所有开发中常用的依赖的版本号实现自动版本仲裁机制即引入依赖默认可以不写版本但是引入非版本仲裁的 jar要写版本号如果想使用依赖的指定版本需要在当前项目的 maven 配置文件中的 properties 标签声明 1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。 2、在当前项目里面重写配置propertiesmysql.version5.1.43/mysql.version/properties场景启动器spring-boot-starter-*只要引入 starter这个场景的所有常规需要的依赖都进行自动引入所有的启动器底层都依赖 SpringBoot 核心依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.6.3/versionscopecompile/scope /dependency3 SpringBoot 特性自动配置 主程序所在包及其下面的所有子包里面的组件需要 Component、Controller… 注解才能称为组件不加注解无法扫描都会被默认扫描进来不用显式地配置组件扫描各种配置拥有默认值并按需加载所有自动配置项主程序类的注解 SpringBootApplication SpringBootConfiguration EnableAutoConfiguration ComponentScan(主程序类所在包)自动配置流程 (Ⅰ) SpringBoot 加载所有的自动配置类xxxxxAutoConfiguration类而非组件 (Ⅱ) 每个自动配置类按照条件生效默认绑定配置文件指定的值xxxxProperties类 (Ⅲ) 生效的配置类就会给容器中装配很多组件 (Ⅳ) 如果要自定义配置可以选择创建 Bean 替换底层组件或修改组件获取的配置文件这些文件最终都映射到 application.properties 二 SpringBoot 的 IOC容器 1 组件添加Configuration Configuration 注解的类相当于原来的 xml 配置文件配置类本身也是组件向 IOC 容器中注入 Bean对 Configuration 类中的方法使用 Bean 注解将方法的返回对象注入容器默认情况下注入容器的对象名为被注解的方法名如果要修改则向 Bean 中传递参数 Configuration class MyConfig {Bean // 根据方法的返回值向IOC容器中注入对象默认情况下的对象名为 jerrymousepublic Pet jerrymouse() {return new Pet(Jerry, 3);} }代理 Bean 方法Configuration(proxyBeanMethod true) 时Full 模式对于 Bean 注解的方法如果直接被调用方法返回的对象是单例的如果是 Configuration(proxyBeanMethod false) Lite 模式则非单例Full / Lite 模式与组件依赖问题 配置的组件之间无依赖关系用 Lite 模式加速容器启动过程减少判断 配置类组件之间有依赖关系用 Full 模式组件单实例保证依赖成立 2 组件添加Import 对类进行的注解在 IOC 容器中创建组件名字为类的全类名 Import({User.class, Pet.class}) Configuration(proxyBeanMethods true) public class MyConfig { }3 组件添加Conditional 条件装配满足指定的条件后进行组件装配可以注解类和方法具有一系列的子注解对应不同的情况 ConditionalOnBean(name...)IOC容器具有指定 Bean 时执行当前组件的装配 ConditionalOnMissingBean(name...)IOC容器失去指定 Bean 时执行当前组件的装配 … 4 引入原生配置文件ImportResource 用于注解配置类导入 Spring 的 xml 配置文件传递参数为配置文件的路径 ImportResource(classpath:myspringconfig.xml) 5 配置绑定ConfigurationProperties 目的是使得 Java 读取到 properties 文件中的内容并且把它封装到 JavaBean 中以供随时修改并使用即JavaBean 和配置文件的绑定ConfigurationProperties 注解需要填入 prefix 属性以在配置文件中指定其对象的属性值 Component ConfigurationProperties(prefix jjjerry) public class Pet {private String name;private int age;... }// 在 application.properties 配置中: // jjjerry.name杰瑞 // jjjerry.age10如果是自定义类在自定义类上注解 ConfigurationProperties 即可如果非自定义类需要在配置类上额外注解 EnableConfigurationProperties(Pet.class)它的作用是开启 Pet 的配置绑定功能并将 Pet 组件自动注册到容器中 6 Lombok 的使用 简化 Bean 的开发 Data // 创建 getter、setter AllArgsConstructor // 有参构造器 NoArgsConstructor // 无参构造器 ToString // ... EqualsAndHashCode // ... public class Person {private String name;private String address; }Slf4j 简化日志记录为注解的类注入了 log 实例 Slf4j SpringBootApplication public class Application {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(Application.class, args);log.info(String.valueOf(context.getBean(wubai).toString()));} }Configuration class MyConfiguration {Beanpublic Person wubai() {return new Person(wubai, taipei);} }三 yaml 配置文件 是一种面向数据的配置文件推荐在配置组件属性时使用 1 基本语法 大小写敏感使用缩进表示层级关系缩进不允许使用tab只允许空格缩进的空格数不重要只要相同层级的元素左对齐即可#表示注释使用 key: value 的形式注意其中的空格字符串无需使用引号标注使用引号时单引号的转义字符不起作用双引号起作用详细的语法规则 2 使用示例 创建名为 wubai_wujunlin 的组件并注入 IOC 容器 Component(value wubai_wujunlin) // 组件在 IOC 容器中的名字 ConfigurationProperties(prefix wujunlin) // 组件在配置文件中的前缀 Data AllArgsConstructor NoArgsConstructor ToString EqualsAndHashCode public class Person {private String name;private String address;private ListString bandMates; }依赖的 application.yaml wujunlin:name: 吴俊霖address: 台北bandMates: [小朱, 大猫, Dino]3 添加配置提示自动补全 在 maven 配置文件添加 !--添加自动补全功能--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional /dependency!--打包时不包括自动补全--buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactId/exclude/excludes/configuration/plugin/plugins/build四 实例后端管理系统 1 静态资源的配置与访问 默认静态资源在 resources 目录下的 static 、public… 文件夹内访问时使用的路径当前项目根路径/ 静态资源名自定义访问静态资源使用的路径 spring:mvc:static-path-pattern: /custom_static_url/** # 访问时 http://localhost:8080/custom_static_url/bf1.png欢迎页默认为静态资源路径下的 index.html输入地址 http://localhost:8080 即可访问欢迎页在静态资源目录下的 favicon.ico 同样会被自动解析 2 配置控制器 为了避免刷新页面导致表单的重复提交首次成功登陆后在控制器方法中返回 redirect:/main.html 重定向到新的页面 Controller public class IndexController {GetMapping(value {/login, /})public String loginPage() {return login;}PostMapping(/login)public String processLogin(User user, HttpSession session, Model model) {if (!user.getUsername().isEmpty() !user.getPassword().isEmpty()) { // 省略判断逻辑session.setAttribute(loginUser, user);return redirect:/main.html; // 使用重定向防止表单的重复提交} else {model.addAttribute(msg, 账号密码错误);return login;}}GetMapping(/main.html) // 直接访问 http://localhost:8080/main.html 仍然需要经过视图解析器才能获取main.html而不能直接读取静态资源public String mainPage(HttpSession session, Model model) {if (session.getAttribute(loginUser) ! null) {return main;} else {model.addAttribute(msg, 未登录);return login;}} }3 Thymeleaf 抽取页面的相同元素 官方文档对于 th:insert, th:replace, th:include 的示例 bodydiv th:insertfooter :: copy/divdiv th:replacefooter :: copy/divdiv th:includefooter :: copy/div/body…will result in: bodydivfootercopy; 2011 The Good Thymes Virtual Grocery/footer/divfootercopy; 2011 The Good Thymes Virtual Grocery/footerdivcopy; 2011 The Good Thymes Virtual Grocery/div/body实现步骤 引入命名空间 html langen xmlns:thhttp://www.thymeleaf.org创建公共部分的 html 页面使用 th:fragment 或 id 为公共部分命名 1 使用 fragment 属性命名 head th:fragmentcommonheadermeta charsetUTF-8title表格页面的公共部分/title... /head2 使用 id 属性命名 div idleftmenu classleft-side sticky-left-side... /div导入公共部分 1 对于 th:fragment 命名的标签添加属性 th:xx(replace/insert/include)公共文件名 :: fragment属性 div th:replacecommon :: commonheader/div2 对于 id 命名的标签添加属性 th:xx(replace/insert/include)公共文件名 :: #id属性 div th:replacecommon :: #leftmenu/div4 配置拦截器 拦截路径为 /** 时静态资源的访问也会被拦截需要为静态资源路径添加放行配置类 Configuration public class MyConfig implements WebMvcConfigurer {// 配置拦截器Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns(/**) // 静态请求也会被拦截.excludePathPatterns(/, /login, /css/**, /fonts/**, /images/**, /js/**); // 放行不登陆就能访问的页面和静态资源} }拦截器的实现 Slf4j public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Object user request.getAttribute(loginUser);if (user ! null) {return true;} else {// 未登录跳转到登录页// response.sendRedirect(/); 或request.getRequestDispatcher(/).forward(request, response);log.warn(未登录);return false;}}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//...HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//...HandlerInterceptor.super.afterCompletion(request, response, handler, ex);} }5 文件上传 html 的 from 标签 form roleform th:action{/upload} methodpost enctypemultipart/form-datadiv classform-grouplabel forexampleInputFile上传单个文件/labelinput typefile namesingleImage idexampleInputFile1/divdiv classform-grouplabel forexampleInputFile上传多个文件添加 multiple 属性/labelinput typefile namemultiImage idexampleInputFile2 multiple/div/form控制器方法 使用 MultipartFile 参数类型获取上传文件其方法 transferTo(...) 用于保存文件到服务器 PostMapping(/upload)public String upload(RequestPart(headerImage) MultipartFile headerImg,RequestPart(lifeImage) MultipartFile[] lifeImg) throws IOException {// 保存上传文件if (!headerImg.isEmpty()) {String fileName headerImg.getOriginalFilename();headerImg.transferTo(new File(E:\\ fileName));}// 多个文件用 for 循环上传// ...return redirect:/main.html;}6 错误处理 SpringBoot 默认的错误处理机制error/下的4xx5xx页面会被自动解析发生错误时有精确的错误状态码页面就匹配精确没有就找 4xx / 5xx如果都没有就触发白页 五 注入原生 Web 组件ServletFilterListener 1 使用 Servlet API推荐 使用 WebServletWebFilterWebListener 注解对应的类并在启动类注解 ServletComponentScan 传入 Web 组件位置 WebServlet(urlPatterns /) public class MyServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//...} }WebFilter(urlPatterns {/**}) public class MyFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println(过滤器初始化);}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println(执行过滤操作);filterChain.doFilter(servletRequest, servletResponse);}Overridepublic void destroy() {System.out.println(过滤器销毁);} }WebListener public class MyListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println(监听到项目初始化);}Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println(监听到项目销毁);} }2 使用 RegistrationBean 无需注解 Configuration public class MyRegistConfig {Beanpublic ServletRegistrationBean myServlet(){MyServlet myServlet new MyServlet();return new ServletRegistrationBean(myServlet,/my,/my02);}Beanpublic FilterRegistrationBean myFilter(){MyFilter myFilter new MyFilter();FilterRegistrationBean filterRegistrationBean new FilterRegistrationBean(myFilter);filterRegistrationBean.setUrlPatterns(Arrays.asList(/my,/css/*));return filterRegistrationBean;}Beanpublic ServletListenerRegistrationBean myListener(){MySwervletContextListener mySwervletContextListener new MySwervletContextListener();return new ServletListenerRegistrationBean(mySwervletContextListener);} }六 数据访问 1 导入 JDBC 场景 创建项目时在 Spring Initializer 中勾选 JDBC 即可 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependency默认的数据源是 HikariDataSource常规配置 spring:datasource:driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: 123url: jdbc:mysql://localhost:3306/test2 切换 Druid 数据源 引入依赖 dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.8/version/dependency配置示例 spring:datasource:driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: 123url: jdbc:mysql://localhost:3306/testdruid:aop-patterns: com.atguigu.admin.* #监控SpringBeanfilters: stat,wall # 底层开启功能statsql监控wall防火墙stat-view-servlet: # 配置监控页功能enabled: truelogin-username: adminlogin-password: adminresetEnable: falseweb-stat-filter: # 监控webenabled: trueurlPattern: /*exclusions: *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*filter: # 配置开启的filterstat: # 对上面filters里面的stat的详细配置slow-sql-millis: 1000logSlowSql: trueenabled: truewall:enabled: trueconfig:drop-table-allow: false 3 整合 MyBatis … 七 单元测试 1 JUnit5 JUnit 5 JUnit Platform基础框架 JUnit Jupiter核心 JUnit Vintage向下兼容 JUnit Platform: 在JVM上启动测试框架的基础不仅支持Junit自制的测试引擎其他测试引擎也都可以接入JUnit Jupiter: JUnit Jupiter 提供了 JUnit5 的新的编程模型是 JUnit5 新特性的核心。内部 包含了一个测试引擎用于在Junit Platform上运行JUnit Vintage: JUnit Vintage提供了兼容JUnit4.xJunit3.x的测试引擎 2 常用注解 Test :标注方法是测试方法ParameterizedTest:表示方法是参数化测试RepeatedTest:重复执行测试方法DisplayName:为测试类或者测试方法设置展示名称BeforeEach :在每个单元测试之前执行AfterEach :在每个单元测试之后执行BeforeAll :在所有单元测试之前执行方法需要 static 修饰AfterAll :在所有单元测试之后执行方法需要 static 修饰Tag :表示单元测试类别Disabled :不执行测试类或测试方法Timeout :测试方法运行如果超过了指定时间将会返回错误ExtendWith :为测试类或测试方法提供扩展类引用 3 断言 assert 简单断言 方法说明assertEquals判断两个对象或两个原始类型是否相等assertEquals判断两个对象或两个原始类型是否相等assertNotEquals判断两个对象或两个原始类型是否不相等assertSame判断两个对象引用是否指向同一个对象assertNotSame判断两个对象引用是否指向不同的对象assertTrue判断给定的布尔值是否为 trueassertFalse判断给定的布尔值是否为 falseassertNull判断给定的对象引用是否为 nullassertNotNull判断给定的对象引用是否不为 null 数组断言 通过 assertArrayEquals(...) 方法来判断两个对象或原始类型的数组是否相等对于对象类型数组比较的方式是逻辑等于即调用 equals 方法 Test DisplayName(array assertion) public void array() {assertArrayEquals(new int[]{1, 2}, new int[] {1, 2}); }组合断言 要求一系列断言同时满足使用 lambda 表达式提供方法实参lambda 表达式对应函数式编程 Test DisplayName(assert all) public void all() {assertAll(Math,() - assertEquals(2, 1 1),() - assertTrue(1 0)); }异常断言 assertThrows 方法需要的参数异常类型的 class 属性需要抛出异常的语句的 lambda 表达式 Test DisplayName(异常测试) public void exceptionTest() {Assertions.assertThrows(ArithmeticException.class, () - System.out.println(1 % 0)); }超时断言 Test DisplayName(超时测试) public void timeoutTest() {Assertions.assertTimeout(Duration.ofMillis(1000), () - Thread.sleep(500)); }快速失败 Test DisplayName(fail) public void shouldFail() {fail(This should fail); }4 假设 assumption 假设作为单元测试的前提条件如果前提条件不满足则没有进行测试的必要不满足的断言会使得测试方法失败不满足的前置条件只会使得测试方法的执行终止而不会引起测试失败assumeTrue 和 assumFalse 确保给定的条件为 true 或 false不满足条件会使得测试执行终止assumingThat 的参数是表示条件的布尔值和对应的 Executable 接口的实现对象只有条件满足时Executable 对象才会被执行当条件不满足时测试执行并不会终止 DisplayName(前置条件) public class AssumptionsTest {private final String environment DEV;Testpublic void simpleAssume() {assumeTrue(Objects.equals(this.environment, DEV));assumeFalse(() - Objects.equals(this.environment, PROD));}Testpublic void assumeThenDo() {assumingThat(Objects.equals(this.environment, DEV),() - System.out.println(In DEV));} }5 嵌套测试 目的是将测试过程结构化把相关的测试方法组织在一起对测试类及其内部类使用 Nested 注解实现嵌套测试 DisplayName(A stack) class TestingAStackDemo {StackObject stack;// 最外层测试方法Testvoid isInstantiatedWithNew() {new Stack();}// 嵌套第一层测试类Nestedclass WhenNew {BeforeEachvoid createNewStack() {stack new Stack();}Testvoid isEmpty() {assertTrue(stack.isEmpty());}// 嵌套第二层测试类NestedDisplayName(after pushing an element)class AfterPushing {String anElement an element;BeforeEachvoid pushAnElement() {stack.push(anElement);}TestDisplayName(it is no longer empty)void isNotEmpty() {assertFalse(stack.isEmpty());}}} }八 指标监控 微服务在云上部署以后都需要对其进行监控、追踪、审计、控制等。SpringBoot 抽取了Actuator 场景使得每个微服务可获得生产级别的应用监控、审计等功能 1 开启方法 引入场景依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency配置暴露端点endpoint及暴露方式 management:endpoints:enabled-by-default: true #暴露所有端点信息web:exposure:include: * #以web方式暴露访问 http://localhost:8080/actuator/... 监控对应指标 2 常用端点 Health健康状况Metrics运行时指标Loggers日志记录
http://www.zqtcl.cn/news/137440/

相关文章:

  • 网站建设服务联享科技net和cn哪个做网站好
  • 深圳网站制作公司哪家好艺考培训学校
  • 潍坊网站的公司电话html网站开发基础
  • 网站模板样式做地图特效的网站
  • 商标查询官方网站有没有免费找客户的软件
  • 网站开发及服务合同行业网站名称
  • 网站建设费包括什么建筑设计领域
  • 网站建设 信科网络建行网站会员注册用户名
  • 网站建设的什么是开发实施注意什么网站开发实用技术pdf
  • 网站设计的资质叫什么贵阳网站建设咨询
  • 郑州哪家公司做网站怎么做自己的销售网站
  • 北大青鸟教网站开发吗中国电信 网站备案
  • 网站目录结构图wordpress ftp连接不上
  • 使用php做的网站有哪些网站备案密码重置申请表
  • php网站开发好找工作吗一叶子电子商务网站建设策划书
  • 运营好还是网站开发好购买域名后怎样建公司官网
  • 优秀设计网站推荐晋江市住房和城乡建设局网站
  • 杭州市区网站制作单位青海公路建设服务网站
  • 大型门户网站建设美丽杭州房价
  • 素材下载解析接口网站开发网站关键词热度
  • 山东seo推广网站建设新乡手机网站建设官网
  • 网站定制公司报价wordpress清新模板下载
  • 斗鱼网站开发是用什么语言东莞人才网智通
  • 淘宝上网站建设为啥这么便宜自己如何建设个网站
  • 做网站判多少年滦南网站建设
  • 网站开发难不难学做网站会提供源代码吗
  • 一个学校怎么制作网站阿里云服务器登录
  • 网站建设哪家合适对网站建设服务公司的看法
  • 网站留住访客柳州正规网站建设加盟
  • 网站照片要求现在百度怎么优化排名