Java Web 项目入门指南(会话技术[cookie、session]、Filter、Listener)

简介: Java Web 项目入门指南(会话技术[cookie、session]、Filter、Listener)

会话技术:cookie、session

概述

会话技术的作用:是用来存储会话过程中,浏览器和服务器交互产生的N多数据的

会话技术的分类:

  • cookie(客户端的会话技术):用来存储会话过程中浏览器和服务器交互产生的N多数据的,整个cookie保留浏览器上
  • session(服务器端的会话技术):用来存储会话过程中浏览器和服务器交互产生的N多数据的,整个session保留服务器上

使用 cookie 或 session 去存储浏览器和服务器交互中产生的数据的场景:

  • 当用户有私人数据需要在多个 servlet 间进行传递的时候,可以选择使用会话技术(cookie 和 session)


cookie:客户端的会话技术

概述

作用:存储数据进行传递的

特点:

  • 整个 cookie 存储在浏览器上
  • 由服务器端创建给浏览端保存的

cookie 的整个使用过程(完成私人数据在多个 servlet 之间进行数据传递):

  1. 服务器创建 cookie 存储数据 ==> 把整个 cookie 传递给浏览器 ==> 浏览器端自动保存 cookie(key值会覆盖)
  2. 再次访问:浏览器会自动将保存的 cookie 传递服务器资源 ==> 服务器获取传递的 cookie 数据 ==> 使用 cookie 数据

cookie的应用场景

  • 记住用户名
  • 自动登录(记住用户名和密码)
  • 记录用户上次访问时间
  • 浏览器商品记录


注意:

  • cookie 中不能出现特殊符号,例如:空格,分号(;) ,逗号(,)

    如果存入的数据不合法,会出现一个错误:

    java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value

    cookie 对于基本符号、数字、和字母是可以存储的。

    如果一定要在 cookie 中保存非法数据,可以将非法数据转换成符号、数字、和字母形式存储,要使用的时候再转换成正常的数据(解码)即可。

  • cookie 存入的数据有大小限制 4kb


常用方法

Cookie

// 创建cookie对象
Cookie(String name, String value)
// 获取cookie的名称
String getName()
// 获取cookie的值
String getValue()
// 设置cookie的最大生存时间(单位:秒),超过了该时间后Cookie会自动销毁
void setMaxAge(int expiry) 
// 设置cookie的有效路径。浏览器根据这个路径判断在访问哪些资源时携带该cookie给服务器
void setPath(String uri) 

HttpServletResponse

// 将cookie发送给浏览器。注意:服务器可以给浏览器传递多个cookie,浏览器都会保存,但存在key值覆盖
void addCookie(Cookie cookie)

HttpServletRequest

// 获取浏览器发送的cookie
Cookie[] getCookies()

注意:

  • cookie 主要是通过名称和路径来确定他的唯一性的

    例如:以下表示的是两个 cookie,虽然名字一样,但是路径不同 , 所以两个 cookie 可以同时存在。

    /day04/a/b/cookie1

    /day04/a/cookie1

    如果路径和名称一样,后添加的 cookie 将覆盖前者


cookie 技术原理分析

image-20221226225241234.png


Cookie 的生命周期、有效路径

Cookie 的生命周期

  • 会话级别的 Cookie:默认,关闭了浏览器 Cookie 就销毁了.
  • 持久级别的 Cookie:可以设置指定 cookie 在浏览器的存活时间,Cookie 就不会随着浏览器关闭而销毁了

    // 设置cookie的最大生存时间(单位:秒),超过了该时间后Cookie会自动销毁
    void setMaxAge(int expiry) 
      // >0 : 有效时间
      // =0 :过期(清除)

    注意:

    • 当时间为 0 的时候,意思为立即删除此Cookie(前提:path 和 name 必须一致)

      要删除已经存在的 cookie,用来覆盖的 cookie 的名称与路径必须与原来的 cookie 一致


Cookie 的有效路径

// 设置cookie的有效路径。浏览器根据这个路径判断在访问哪些资源时携带该cookie给服务器
void setPath(String uri) 
  • 默认不写 :代表当前 cookie 的有效路径是当前 servlet 的上一级资源路径,只要浏览器访问该资源路径,就会携带该 cookie
  • / :代表浏览器访问整个服务器上的项目资源,都会携带该 cookie
  • /web05 :代表浏览器访问整个 /web05 项目下的资源时,都会携带该 cookie,访问别的项目资源不携带(常用)
  • /web05/cs5 :只在访问 /web05/cs5 资源才会携带该 cookie


session:服务器端的会话技术

概述

session 是保存在服务器端的会话技术,当通常情况下,Session 是借助 Cookie 技术来传递 ID 属性的。

session 的作用:为了保存会话中产生的数据

特点:

  • 保存在 session 中的数据在服务器端。由服务器创建的
  • session 其实是一个域对象,xxxAttribute() 存储数据的方法

作用范围:

  • session 中的数据在一次会话中共享

    因为在一次会话中,访问多少个 servlet,获取到的 session 都是同一个

    但是如果不在一次会话中,多个 servlet 中产生的不再是同一个 session 对象

    底层原因是不同会话中 cookie 携带的 jessionid(session 的 id)不一样

生命周期:

  • 创建:java 认为当浏览器首次执行到了 request.getSession 方法的时候创建 session 对象
  • 销毁:

    • 被动销毁:默认当前 session 30 分钟不使用会被销毁
    • 主动销毁:session.invalidate()
    • 服务器非正常关闭 session 会销毁

      服务器正常关闭 session 不会销毁,会持久化到硬盘上,服务器开启后,会默认从硬盘上回到服务器中


session 的与 cookie 的区别

cookie session
会话数据保存的位置 浏览器 服务器
数据的安全性 不安全 安全
存储数据是否有限制 有。4kb,且只能字符串


存储数据与获取数据 API

  • HttpServletRequest

    // 获取session对象
    HttpSession getSession()
  • HttpSession

    // 在session中保存数据 
    void setAttribute(String name, Object value)
    // 从session中获取数据。注意:返回值是Object,因此需要将返回值强制转换才能方便使用
    Object getAttribute(String name)
    // 从session中移除数据
    void removeAttribute(String name)


session 的剖析

在一次会话中,使用的都是同一个 session 对象剖析:

  • session 的一切是由 request.getSession() 开始
  • 当程序执行到 request.getSession() 方法时,首先会判断用户的浏览器是否携带了 jsessionid

    • 用户浏览器没有携带 jsessionid:

      tomcat 会在服务器上开启一块空间(创建一个新的session对象),用来存入数据,然后会创建一个 cookie,将这块空间的地址记录给 cookie(key:jessionid),然后将这个 cookie 写回给访问者的浏览器(会话级别)

    • 用户浏览器携带了 jsessionid:

      tomcat 就不会再去开启空间(创建 session),而是根据浏览器带来的 jessionid 找到 session 地址,从该 session 中取出数据


Filter:过滤器

概述

过滤器的使用场景:

  • 实际项目中,对访问某些资源的请求需要进条件的筛选、过滤。
  • 当这个请求满足特定的情况,才能让这 个请求访问目标资源,如果不满足条件,就不让访问目标资源。
  • 比如:对于访问管理员功能的请求,应该对这样的请求进行管理员权限的判断。如果当前用户拥有管理员权限,可以访问。反之不可以。

Filter:是 Java 中预先定义好了的接口,可以过滤不同的内容,具体怎么过滤,需要使用者定义一个实现类,然后实现接口中的过滤方法,在方法中书写过滤的条件。filter 是对客户端访问资源的过滤,符合条件放行,不符合条件不放行

主要作用:对浏览器的请求进行拦截过滤的


filter 的使用

Filter 接口 API

// 过滤器的初始化方法
void init(FilterConfig filterConfig)
// 过滤器的核心过滤方法。写具体的过滤逻辑
void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
// 过滤器的销毁方法
void destroy()


使用步骤

  1. 创建一个 java 类,实现 filter 的接口,并实现方法 doFilter()

    //@WebFilter(filterName = "MyFilter1",urlPatterns = "/sd1")
    public class MyFilter implements Filter{
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {}
    
        //核心过滤方法
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("MyFilter进行服务器资源的过滤了...");
            //默认是拦截不放行的   手动放行(固定代码)
            filterChain.doFilter(servletRequest,servletResponse);
        }
    
        @Override
        public void destroy() {}
    }
  2. 注册 filter

    方式1:在自定义的 filter 类上添加 @WebFilter 注解:

    @WebFilter(filterName = "MyFilter1", urlPatterns = "/sd1")
    • filterName 属性:过滤器名称
    • urlPatterns 属性:过滤器生效的接口路径

      路径配置规则与 servlet 相同(完全匹配、目录匹配、拓展名匹配)

    方式2:在 web.xml 中配置 filter 要拦截的资源

        <!--配置filter要拦截的服务器资源-->
        <filter>
            <!--filter的名称-->
            <filter-name>MyFilter</filter-name>
            <!--全限定名  包名+类名-->
            <filter-class>cn.itcast.filter.MyFilter</filter-class>
        </filter>
    
        <filter-mapping>
            <!--filter的名称-->
            <filter-name>MyFilter</filter-name>
            <!--要拦截的服务器资源路径-->
            <url-pattern>/sd1</url-pattern>
        </filter-mapping>


filter 的执行顺序、执行流程、生命周期

过滤器链:需要对同一个请求,进行多次不同业务的过滤时,可以配置多个过滤器,只有所有的过滤器都对请求进行了放行,请求才能访问到目标资源,只要多个过滤器中只有一个过滤器不放行请求,那么这个请求都不能够访问到目标资源。多个过滤器组成的一个整体称为过滤器链。而且,过滤器链中的过滤器是一个一个的执行的,一个过滤器执行完毕之后,会执行下一个过滤器,后面没有过滤器了,才会访问到目标资源。只要其中一个过滤器没有放行,那么这个过滤器后面的过滤器也都不会执行了。

过滤器链中多个过滤器的执行顺序:

  • 注解方式:如果多个 filter 对同一个资源进行了拦截,执行的顺序是按照 filter 文件名的自然排序顺序执行
  • 配置文件方式:如果多个 filter 对同一个资源进行了拦截,执行的顺序是配置文件的从上到下顺序


filter 的执行流程

Snipaste_2022-04-29_11-35-02.jpg

filter执行流程.png


filter 的生命周期

从 filter 的出生到 filter 的死亡,有3个方法:

  • init() :过滤器的初始化方法

    服务器启动时在 servlet 容器创建 filter 对象后执行一次 init 方法

    在要求过滤器做任何过滤工作之前,init 方法必须成功完成

    void init(FilterConfig filterConfig)

    参数说明:

    • filterConfig :当前 filter 的配置对象

      作用:

      • 可以获取到当前 filter 的名称:getFilterName()
      • 可以获取到 ServletContext 对象:getServletContext()
  • dofilter() :过滤器的核心过滤方法

    当请求符合 Filter 拦截路径时,都会执行 doFilter 方法,访问一次执行一次。

    void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

    参数说明:

    • chain:可以做当前 filter 的放行:chain.dofilter(req, resp)

    注意:

    • 如果需要让这个请求通过过滤器,继续访问目标资源,一定得调用 FilterChain 对象的 doFilter 方法,不然请求就被过滤器拦截了
    • FilterChain 对象的 doFilter 方法表示对于请求放行
  • destory() :过滤器的销毁方法

    当关闭服务器时,销毁当前 filter 时执行


filter 的拦截方式

filter 默认只拦截 Request(浏览器过来的请求,包括重定向),不拦截 Forward(服务器内部的请求,即请求转发)

如果想让filter拦截服务器内部的请求:

  • 注解方式

    配置 dispatcherTypes 属性,属性值新增 DispatcherType.FORWARD

    @WebFilter(dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})

    该注解属性配置既会拦截浏览器过来的请求,又会拦截服务器内部的请求

  • xml 方式配置

    <filter-mapping> 的标签中添加标签 <dispatcher>FORWARD</dispatcher> ,但是这种配置将 filter 默认的拦截方式给覆盖了,只会拦截服务器内部的请求,不会再拦截默认的浏览器请求了

    想让 filter 拦截服务器内部的请求又拦截浏览器过来的请求:

        <filter-mapping>
            <filter-name>MyFilter2</filter-name>
            <url-pattern>/*</url-pattern>
            <dispatcher>FORWARD</dispatcher>  <!-- 配置拦截服务器内部请求 -->
            <dispatcher>REQUEST</dispatcher>  <!-- 配置拦截浏览器的请求 -->
        </filter-mapping>


使用案例

解决全站乱码

浏览器发出的任何请求,通过过滤器统一处理中文乱码。

@WebFilter(filterName = "EnCodingFilter",urlPatterns = "/*")
public class EnCodingFilter implements Filter {
     @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        // 在执行servlet获取数据和响应数据之前执行该代码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        // 放行之前 处理中文乱码
        chain.doFilter(req, resp);
    }
    
    @Override
    public void destroy() {}


非法字符的拦截

@WebFilter(filterName = "FeifaFilter",urlPatterns = "/sd3")
public class FeifaFilter implements Filter {
    private List<String> list;
    
    //服务器启动就执行 且只执行一次
    @Override
    public void init(FilterConfig config) throws ServletException {
        // 加载一个非法字符的文档(properties)
            //底层:会自动去src下加载后缀名为properties的文件
        ResourceBundle bundle = ResourceBundle.getBundle("feifa");
        String value = bundle.getString("feifa"); 
        // 读取文档中的数据,放入到集合中
        String[] arr = value.split(",");
        list = Arrays.asList(arr);
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
       // 获取用户发表的言论
        HttpServletRequest request=(HttpServletRequest)req;
        HttpServletResponse response=(HttpServletResponse)resp;

        String info = request.getParameter("info");
        // 判断言论是否合法
            // 遍历循环集合,将集合的非法字符和接受到的数据做包含
            // 包含上:就是非法  没包含上:就是合法
        for(String value:list){
             if(info.contains(value)){
                 // 不合法--不放行 直接给浏览器响应信息
                 // 包含上:就是非法
                 response.getWriter().print("你发表的言论有非法行为,请思考后再发表...");
                 return;
             }
        }

        //合法--直接放行
        chain.doFilter(request, resp);
    }
    
    @Override
    public void destroy() {}


Listener:监听器

概述

web 监听器是一种 Servlet 中的特殊的类,可以帮助开发者监听web中的特定事件,比如 ServletContext, HttpSession, ServletRequest 的创建和销毁等。可以在某些动作前后增加处理,实现监控。

Listener 的作用:监听 ServletContext, HttpSession, ServletRequest 三大域对象的状态变化(三个域对象的创建和销毁)

使用场景:

  • 系统启动时初始化信息

    ServletContextListenner 用来监听 ServletContext 对象的创建和销毁的

    当项目启动,servletContext 对象被创建时,会调用 ServletContextListenner 的 contextInitialized 方法,所以可以在此方法中初始化项目需要的信息

    注:spring 框架会使用到它

  • 统计在线人数

    每当一个用户访问项目的时候,都会创建一个 session 会话。所以当前 session 会话被创建,当前在线用 户 +1,每当 session 会话被销毁,当前在线用户 -1

    HttpSessionListener 可以用来监听 session 对象的创建和销毁的,所以可以在 HttpSessionListener 中的监听 session 对象创建和销毁的方法中控制在线人数的加减

java 提供了监听器规范,不同的监听器规范要监听的内容不一样

常见监听器:

  • ServletContextListener(常用):监听 ServletContext 对象的创建和销毁

    例如:框架的配置文件在服务器启动就执行

  • ServletRequestListener :监听 ServletRequest 对象的创建和销毁
  • HttpSessionListener :监听 HttpSession 对象的创建和销毁


listener 的使用

API

  • ServletContextListenner 接口

    // 监听 servletcontext 对象的创建
    void contextInitialized(ServletContextEvent sce)
    // 监听 servletcontext 对象的销毁
    void contextDestroyed(ServletContextEvent sce)
  • ServletRequestListener 接口

    // 监听 ServletRequest 对象的创建
    void requestInitialized(ServletRequestEvent servletRequestEvent)
    // 监听 ServletRequest 对象的创建
    void requestDestroyed(ServletRequestEvent servletRequestEvent)
  • HttpSessionListener 接口

    // 监听 HttpSession 对象的创建
    void sessionCreated(HttpSessionEvent httpSessionEvent)
    // 监听 HttpSession 对象的创建
    void sessionDestroyed(HttpSessionEvent httpSessionEvent)


使用步骤(以 ServletContextListenner 监听器为例)

  1. 创建一个类实现 ServletContextListenner 接口,并实现方法 contextInitialized() 和contextDestroyed()

    // 监听servletContext对象的创建和销毁。需实现java提供的监听器规范(ServletContextListener)
    //@WebListener
    public class ServletContextLoaderListener implements ServletContextListener {
    
        // 当servletContext对象被创建了,监听器触发,该方法执行
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            System.out.println("servletContext对象被创建了...");
    
            // 让服务器一加载,就读取框架的配置信息,进行加载
            ServletContext servletContext = servletContextEvent.getServletContext();
            String value = servletContext.getInitParameter("spring");
            System.out.println("就可以正式根据获取到的配置文件名,对该文件的内容进行加载了:"+value);
            System.out.println("正在加载该配置文件中....");
    
        }
    
        @Override //当servletContext对象被销毁了 监听器触发 该方法执行
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            System.out.println("servletContext对象被销毁了...");
        }
    }
  2. 注册监听器

    • 方式1:在实现类上添加注解 @WebListene
    • 方式2:在 xml 中配置

      <listener> 
          <listener‐class>com.itheima.listenner.MyServletContextListenner1</listener‐class> </listener>


案例

统计网站当前在线人数 HttpSessionListener

session 监听器,统计 session 个数

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener()
public class MyHttpSession implements HttpSessionListener { 
    //当前在线人数的属性名称 
    private static final String NUMBER = "NUMBER";
    
    /* 
     * session 创建时触发 
     */ 
    @Override 
    public void sessionCreated(HttpSessionEvent event) { 
        //会话创建了,有新用户访问网站
        HttpSession session = event.getSession();
        //新创建的会话对象 
        ServletContext servletContext = session.getServletContext();
        //获取当前项目环境对象 
        System.out.println("session创建了" + session.getId()); 
        Integer n = (Integer) servletContext.getAttribute(NUMBER);
        //当前在线人数 
        if( n== null){
            //如果 n==null 说明是第一个用户 ,直接设置n=1 
            servletContext.setAttribute(NUMBER, 1); 
        }else{
            //如果n != null 直接累加 
            servletContext.setAttribute(NUMBER, ++n); 
        }
        //如果 n==null 说明是第一个用户 ,直接设置n=1 
        //如果 n != null 直接累加 
    }
    
    /* 
    * session销毁时触发 
    */ 
    @Override 
    public void sessionDestroyed(HttpSessionEvent event) { 
        //会话销毁了,有用户的会话对象销毁了 
        HttpSession session = event.getSession();
        //新创建的会话对象 
        ServletContext servletContext = session.getServletContext();
        //获取当前项目环境对象 
        System.out.println("session销毁了" + session.getId()); 
        Integer n = (Integer) servletContext.getAttribute(NUMBER);
        //当前在线人数 //直接减1 
        servletContext.setAttribute(NUMBER, ‐‐n);
    }
}


拓展

浏览器和服务器交互中文乱码处理

  • 浏览器页面的中文数据请求给服务器,如果使用的 post 提交,服务器接受会发生乱码

    解决:处理请求的中文数据乱码

    request.setCharacterEncoding("utf-8"); 
  • 服务器给浏览器中文数据的时候,浏览器会发生乱码行为

    解决: 处理响应的中文数据乱码

    response.setContentType("text/html;charset=utf-8"); 
  • 服务器给浏览器附件框的时候,附件框上有中文,会发生乱码行为(下载才会有附件框)

    解决:

    • 获取用户的浏览器版本

      火狐版本的浏览器:返回去的附件中文设置 base64 编码

      其它版本的浏览器:返回去的附件中文设置 utf-8 编码

    String value = request.getHeader("user-agent");
    String encode;
    if(value.contains("Firefox")){
        //火狐浏览器中文(base64)
        Base64.Encoder encoder = Base64.getEncoder();
        encode = "=?utf-8?B?" + encoder.encodeToString(fileName.getBytes("utf-8")) + "?=";
    } else {
        //其它浏览器中文(utf-8)
        encode = URLEncoder.encode(fileName, "utf-8");
    }
    //小说.txt  --%E5%B0%8F%E8%AF%B4.txt
    response.setHeader("content-disposition", "attachment;filename=" + encode); 


请求转发和重定向的区别

  • 重定向多次请求,请求转发一次请求
  • 重定向是浏览器向服务器发送访问,请求转发是服务器内部资源互相访问
  • 重定向是response对象的API,请求转发是request对象的API
  • 重定向可以访问自己的项目也可以访问别的项目,请求转发只能访问当前自己的项目a

    // 重定向。可以访问外部项目
    response.sendRedirect(request.getContextPath() + "/sd11"); 
    // 请求转发。只能访问当前项目
    request.getRequestDispatcher("/sd7").forward(request,response);


域对象的总结

域对象可以在多个 servlet/jsp 之间进行数据传递

java 后端的域对象有 3 个:

  • ServletContext(公共数据)

    创建:服务器只要启动就创建,且只创建一个

    销毁:服务器关闭就销毁

    存入数据的作用范围:整个 web 项目的所有 servlet 都共享

    因为整个 web 项目只有一个 ServletContext,所有 servlet 中获取的都是同一个 ServletContext 对象

  • request

    创建:请求一次创建一次

    销毁:响应即销毁

    存入数据的作用范围:只能是一次请求的多次转发中共享数据

    只有在一次请求的多次转发中涉及到的多个 servlet 使用的才是一个 request 对象

  • session(私有数据)

    创建:java 认为当浏览器首次执行到了 request.getSession 方法的时候创建 session 对象

    销毁:

    • 被动销毁:默认当前 session 30 分钟不使用会被销毁
    • 主动销毁:session.invalidate()
    • 服务器非正常关闭 session 会销毁

      服务器正常关闭 session 不会销毁,会持久化到硬盘上,服务器开启后,会默认从硬盘上回到服务器中

    存入数据的作用范围:在一次会话中涉及的多个servlet可以共享数据

    因为一次会话中,多个 sevlet 中获取的 session 是同一个


域对象操作的 API

// 存放数据
void setAttribute(String name, Object value)
// 获得数据
Object getAttribute(String name)
// 删除数据
void removeAttribute(String name)
相关文章
|
1月前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
62 11
|
1月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
69 7
|
24天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
10天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
2月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
93 4
|
2月前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
64 1
|
2月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
54 1
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
209 3