SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】上

简介: SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】

使用spring-boot-starter-web启动器,开始web支持,内嵌一个Tomcat,添加了对于SpringMVC的支持。Spring Boot默认servlet容器为tomcat。


Spring Boot supports the following embedded servlet containers:


image.png


常用的服务器配置


配置端口号Spring Boot 默认端口是8080,如果想要进行更改的话,在配置文件中加入:server.port=8081

配置session的超时时间server.servlet.session.timeout=2M


使用Jetty服务器替换Tomcat


项目目录:

1.png


排除Tomcat的启动器,引入Jetty


pom.xml:


<dependencies>
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>
</dependencies>

1.png

application.yml


application.yml:


server:
  port: 80

编写入口程序


入口程序:


package com.keafmd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * Keafmd
 *
 * @ClassName: App03
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-06 13:57
 * @Blog: https://keafmd.blog.csdn.net/
 */
@SpringBootApplication
public class App03 {
    public static void main(String[] args) {
        SpringApplication.run(App03.class,args);
    }
}

编写Controller测试


Controller测试:


package com.keafmd.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * Keafmd
 *
 * @ClassName: JettyController
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-06 13:56
 * @Blog: https://keafmd.blog.csdn.net/
 */
@RestController
public class JettyController {
    /**
     * http://127.0.0.1:80/hello
     * @return
     */
    @GetMapping("/hello")
    public String hello(){
        return "hello keafmd";
    }
}

测试结果


运行启动类,效果如下:


1.png

访问:http://127.0.0.1:80/hello

2.png


Jetty对jsp的支持


添加依赖


springboot中的jetty为内嵌的jetty,支持jsp需要添加额外的依赖。


在pom.xml中添加如下依赖:


<!--jetty容器支持jsp start-->
      <dependency>
          <groupId>org.eclipse.jetty</groupId>
          <artifactId>jetty-server</artifactId>
      </dependency>
      <dependency>
          <groupId>org.eclipse.jetty</groupId>
          <artifactId>apache-jsp</artifactId>
      </dependency>
      <dependency>
          <groupId>org.eclipse.jetty</groupId>
          <artifactId>apache-jstl</artifactId>
      </dependency>
<!--jetty容器支持jsp end-->

SpringBoot集成使用jsp


需要设置:SpringBoot集成使用jsp(超详细)


编写一个jsp

1.png

注意是在webapp的目录下。


index.jsp:


<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/4/6
  Time: 14:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Keafmd</h1>
</body>
</html>

编写Controller


JspController:


package com.keafmd.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
/**
 * Keafmd
 *
 * @ClassName: JspController
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-06 14:43
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Controller
public class JspController {
    /**
     * http://127.0.0.1/keafmd
     * @return
     */
    @GetMapping("/keafmd")
    public String keafmd(){
        return "/index.jsp";
    }
}

测试结果


我提前配置好了80端口。

访问:http://127.0.0.1/keafmd

1.png


配置上下文

application.yml:


server:
  port: 80
spring:
  mvc:
    view:
      prefix: /WEB-INF/user/
      suffix: .jsp

编写user_list.jsp

1.png

user_list.jsp:


<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/4/6
  Time: 14:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>User_List</h1>
</body>
</html>

编写Controller


JspController:


package com.keafmd.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
/**
 * Keafmd
 *
 * @ClassName: JspController
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-06 14:43
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Controller
public class JspController {
    /**
     * http://127.0.0.1/keafmd
     * @return
     */
    @GetMapping("/keafmd")
    public String keafmd(){
        return "/index.jsp";
    }
    @GetMapping("/userlist")
    public String userlist(){
        return "user_list";
    }
}

测试结果


访问:http://127.0.0.1/userlist

1.png


打包(jar和war)


区别:打jar包不能访问jsp资源,war包可以。


引入所需的插件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

打包

1.png



打开war包所在文件位置

1.png

在此处打开cmd,输入启动的命令


java -jar xxxxx.war/.jar

1.png

访问jsp页面

1.png2.png




打jar包的话是访问不到user_list.jsp的,这里就不测试了。


对静态资源的配置


把类路径下的 /static、/public、/resources 和 /META-INF/resources 文件夹下的静态文件直接映射为 /,可以直接通过 http://localhost:8080/ 访问。


在resources下创建static目录,在创建common目录,然后创建tt.css。

1.png

访问:http://127.0.0.1:8080/common/tt.css

2.png



自定义资源映射


static-locations


默认支持的文件路径:classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources

1.png

mm.css:


body{
    padding: 0;
}

tt.css:


body{
    margin: 0;
    padding: 0;
}

在我们没有在application.yml配置文件配置前,访问:http://localhost:8080/mm.css,结果如下↓


1.png

因为mm.css在自定义的mystatic文件夹下,不被静态资源识别,需要自定义。


但是可以直接访问:http://localhost:8080/common/tt.css,因为tt.css在static文件夹下。

2.png

当我们在application.yml配置文件夹下添加上自定义的文件夹后就可以访问了。


application.yml:


spring:
  mvc:
    static-path-pattern: /**
  web:
    resources:
      static-locations: classpath:/mystatic,classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources

访问:http://localhost:8080/mm.css,结果如下↓,配置后可以直接访问。

1.png


static-path-pattern


当我们修改application.xml文件后:


spring:
  mvc:
    static-path-pattern: /css/**
  web:
    resources:
      static-locations: classpath:/mystatic,classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources

像上面那样访问都是失败的了

1.png2.png


我们需要加上/css才可以

3.png4.png



配置自定义的Convert解决日期类型的参数转换


Convert、Formatter:用于接收浏览器请求的参数自动转化成响应类型的数据Stirng(1988-01-01)-Date(1988-01-01)

1.png



User:


package com.keafmd.entity;
import lombok.Data;
import java.util.Date;
/**
 * Keafmd
 *
 * @ClassName: User
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 9:53
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Data
public class User {
    private String id;
    private Integer age;
    private String address;
    private Date createTime;
}

ConverterController:


package com.keafmd.controller;
import com.keafmd.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * Keafmd
 *
 * @ClassName: ConverterController
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 9:54
 * @Blog: https://keafmd.blog.csdn.net/
 */
@RestController
public class ConverterController {
    /**
     * http://127.0.0.1:8080/user?createTime=2021-04-07 01:02:03
     * @param user
     * @return
     */
    @GetMapping("/user")
    User getUserInfo(User user){
        return user;
    }
}

DateConverter:


package com.keafmd.config;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * Keafmd
 *
 * @ClassName: DateConverter
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 9:58
 * @Blog: https://keafmd.blog.csdn.net/
 */
public class DateConverter implements Converter<String, Date> {
    /**
     * yyyy-MM-dd
     *
     * @param source
     * @return
     */
    @Override
    public Date convert(String source) {
        try {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

BootWebMvcConfig:


package com.keafmd.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
 * Keafmd
 *
 * @ClassName: BootWebMvcConfig
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 10:27
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Configuration(proxyBeanMethods = false)
public class BootWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DateConverter());
    }
}

还需要在application.yml配置一下时区和格式。


spring:
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss

启动springboot,访问:http://127.0.0.1:8080/user?createTime=2021-04-07 01:02:03

1.png


自定义拦截器的配置


实现基础springmvc的拦截器


自定义类实现HandlerInterceptor接口


MyInterceptor:


package com.keafmd.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Keafmd
 *
 * @ClassName: MyInterceptor
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 11:41
 * @Blog: https://keafmd.blog.csdn.net/
 */
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor.preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor.postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor.afterCompletion");
    }
}


使用Java的形式配置拦截器的拦截路径


在WebMvcConfig中注册拦截器,实现WebMvcConfigrer接口,并声明Bean。


BootWebMvcConfig:


package com.keafmd.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
 * Keafmd
 *
 * @ClassName: BootWebMvcConfig
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 10:27
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Configuration(proxyBeanMethods = false)
public class BootWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DateConverter());
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    }
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }
}

自定义页面跳转


BootWebMvcConfig:


package com.keafmd.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
 * Keafmd
 *
 * @ClassName: BootWebMvcConfig
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 10:27
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Configuration(proxyBeanMethods = false)
public class BootWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DateConverter());
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
    /**
     * 映射自定义的跳转界面
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/index").setViewName("index.html");
        registry.addViewController("/home").setViewName("index.html");
    }
}

自定义资源映射


1、自动配置(在全局额配置文件中修改)


spring.mvc.static-path-pattern=/

spring.resources.static-locations= classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources


2、自定义资源路径


自定义资源映射,重写WebMvcConfiger实现类的 重写addResourceHandler 方法

调用:addResourceHandler 用于处理哪些路径是静态资源

调用:addResourceLocations用于指定静态资源的实际目录

此方法会覆盖配置文件和默认的静态资源配置


BootWebMvcConfig:


package com.keafmd.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
 * Keafmd
 *
 * @ClassName: BootWebMvcConfig
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 10:27
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Configuration(proxyBeanMethods = false)
public class BootWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DateConverter());
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         * http://127.0.0.1:8080/images/holiday.png
         */
        // registry.addResourceHandler()
        // registry.addResourceHandler("/images/").addResourceLocations("classpath:/imgs/");
        registry.addResourceHandler("/images/**").
                addResourceLocations("classpath:/imgs/",
                        "classpath:/mystatic/" ,
                        "classpath:/static/" ,
                        "classpath:/public/" ,
                        "classpath:/META-INF/resources",
                        "classpath:/resources");
    }
}

错误处理、异常处理


错误的类型:


因为后台程序出错导致的Exception(http 500)


因为参数传递错误(http 400)


客户端的原因造成的路径不对(http 404)


当有错误产生,默认跳转到/error,指向的是BasicErrorController。


定制错误响应:

1、有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的error文件夹下】,发生此状态码的错误就会来到对应的页面

2、没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找

3、以上都没有错误页面,就是默认来到Spring Boot默认的错误提示页面

可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html)


页面能获取的信息:

timestamp:时间戳

status:状态码

error:错误提示

exception:异常对象

message:异常消息

errors:JSR303数据校验的错误都在这里


在WebMvcConfiger的实现类中重写addViewConroller方法。


使用Java异常处理器


1、在Controller层面定义异常处理,哪里有异常哪里处理,只在某一个Controller中生效


JspController:


package com.keafmd.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Keafmd
 *
 * @ClassName: JspController
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 14:09
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Controller
public class JspController {
    /**
     * http://127.0.0.1:8080/toview
     * @return
     */
    @GetMapping("/toview")
    String toview(){
        return "/hello.jsp";
    }
    @GetMapping("/business")
    String business(){
        int result = 0/0;
        return "/index.jsp";
    }
   /* @ExceptionHandler(value = Exception.class )
    @ResponseBody
    String resolveException(HttpServletRequest request, HttpServletResponse response, Exception ex  ){
        System.out.println(ex.getMessage());
        return "{status:'unup',msg:'出错了'}";
    }*/
}

2、定义全局的异常处理方式,定义一个类使用@ControllerAdvice ,在类中定义@ExceptionHandler的注解方法。


MyControllerAdvice:


package com.keafmd.controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Keafmd
 *
 * @ClassName: MyControllerAdvice
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 14:07
 * @Blog: https://keafmd.blog.csdn.net/
 */
@RestControllerAdvice
public class MyControllerAdvice {
    @ExceptionHandler(value = Exception.class )
//    @ResponseBody
    String resolveException(HttpServletRequest request, HttpServletResponse response, Exception ex  ){
        System.out.println(ex.getMessage());
        return "{status:'unup',msg:'全局的处理,Controller出错了'}";
    }
}

效果:

1.png



相关文章
|
3月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
304 4
|
7月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
7月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
|
7月前
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
283 104
|
7月前
|
JavaScript 前端开发 API
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
本文介绍了HarmonyOS应用开发中的HML、CSS和JS语法。HML作为标记语言,支持数据绑定、事件处理、列表渲染等功能;CSS用于样式定义,涵盖尺寸单位、样式导入、选择器及伪类等特性;JS实现业务逻辑,包括ES6语法支持、对象属性、数据方法及事件处理。通过具体代码示例,详细解析了页面构建与交互的实现方式,为开发者提供全面的技术指导。
298 104
|
7月前
|
开发框架 编解码 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(一)
该文档详细介绍了一个兼容JS的类Web开发范式的方舟开发框架,涵盖概述、文件组织、js标签配置及app.js等内容。框架采用HML、CSS、JavaScript三段式开发方式,支持单向数据绑定,适合中小型应用开发。文件组织部分说明了目录结构、访问规则和媒体文件格式;js标签配置包括实例名称、页面路由和窗口样式信息;app.js则描述了应用生命周期与对象管理。整体内容旨在帮助开发者快速构建基于方舟框架的应用程序。
303 102
|
8月前
|
Web App开发 前端开发 JavaScript
鸿蒙5开发宝藏案例分享---Web适配一多开发实践
这是一份实用的鸿蒙Web多设备适配开发指南,针对开发者在不同屏幕尺寸下的布局难题提供了解决方案。文章通过三大法宝(相对单位、媒体查询和窗口监听)详细介绍如何实现智能适配,并提供了多个实战案例,如宫格布局、对话框变形和自适应轮播图等。此外,还分享了调试技巧及工具推荐,帮助开发者快速上手并优化性能。最后鼓励读者实践探索,并提示更多官方资源等待发现。
|
10月前
|
关系型数据库 MySQL 数据库
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
2223 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
619 67