精华内容
下载资源
问答
  • java的一个添加功能的具体实现
    千次阅读
    2021-02-12 16:31:18

    本文实例为大家分享了java web实现简单留言板的具体代码,供大家参考,具体内容如下

    一、目标

    用户可以登录并记住密码进入留言板,添加留言,点击留言列表中的标题可显示该条留言全部内容。

    二、相关知识

    1、使用Cookie实现自动登录

    用户第一次登录网站,服务器将用户名和密码以Cookie的形式发送到客户端。当客户之后再次访问该网站时,浏览器自动将Cookie文件中的用户名和密码随请求一起发送到服务器,服务器从Cookie中取出用户名和密码并且通过验证。

    2、java类的定义与使用

    定义java类时注意属性的定义、构造方法的重写,定义两个方法,一个是访问方法(getter),一个是修改方法(setter)。

    三、实现思路

    1、登录

    输入用户名、密码登录,对应检测登录BoardLoginServlet

    可实现记住登录信息 Cookie实现

    登录成功显示留言板标题列表页面board-title.jsp,登录失败返回登录页面

    2、显示留言标题

    标题列表为上下文变量lists,其中标题为链接,点击可显示留言具体信息界面(跳转到MessageServlet处理)。

    list = username+":"+""+title+"";

    页面下方有新增留言的链接,点击后跳转到写留言页面

    新增留言

    3、添加留言

    输入标题、内容 post给WriteServlet

    4、显示留言具体信息

    在MessageServlet中遍历查找留言并传递变量,显示留言信息在board-message.jsp

    四、代码实现

    board-login.jsp

    登录界面

    昵称:

    密码:

    记住密码

    board-title.jsp

    留言板

    ${lists}

    新增留言

    boarrd-write.jsp

    标题:

    内容:

    board-message.jsp

    留言详情

    用户名:${name}

    标题:${title}

    内容:${text}

    时间:${date}

    Message.java(将留言信息存储在Message类中)

    package board;

    import java.util.Date;

    public class Message {

    private String title;//标题

    private String time;//时间

    private String username;//用户名

    private String text;//内容

    public Message(){}

    //初始化

    public Message(String title,String time,String username,String text){

    this.title = title;

    this.time = time;

    this.username = username;

    this.text = text;

    }

    public String getTitle(){

    return title;

    }

    public String getUsername(){

    return username;

    }

    public String getTime(){

    return time;

    }

    public String getText(){

    return text;

    }

    }

    BoardLoginServlet.java(用Cookie登录)

    package board;

    import javax.servlet.ServletException;

    import javax.servlet.http.*;

    import java.io.IOException;

    @javax.servlet.annotation.WebServlet(name = "BoardLoginServlet",urlPatterns = "/board.do")

    public class BoardLoginServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/html;charset = utf-8");

    request.setCharacterEncoding("UTF-8");

    HttpSession session=request.getSession();

    String username = request.getParameter("username").trim();

    String password = request.getParameter("password").trim();

    session.setAttribute("username",username);

    if (!(username.equals("admin") &&password.equals("admin"))&&!(username.equals("123") &&password.equals("123"))) {

    response.sendRedirect("board-login.jsp");

    } else {

    if ((request.getParameter("check") != null) && (request.getParameter("check").equals("check"))) {

    Cookie nameCookie = new Cookie("username", username);

    Cookie pswdCookie = new Cookie("password", password);

    nameCookie.setMaxAge(60 * 60);

    pswdCookie.setMaxAge(60 * 60);

    nameCookie.setPath("/");

    pswdCookie.setPath("/");

    response.addCookie(nameCookie);

    response.addCookie(pswdCookie);

    String value1 = "", value2 = "";

    Cookie cookie = null;

    Cookie[] cookies = request.getCookies();

    if (cookies != null) {

    for (int i = 0; i < cookies.length; i++) {

    cookie = cookies[i];

    if (cookie.getName().equals("username"))

    value1 = cookie.getValue();

    if (cookie.getName().equals("password"))

    value2 = cookie.getValue();

    }

    if (value1.equals("admin") && value2.equals("admin")||value1.equals("123") && value2.equals("123")) {

    response.sendRedirect("board-title.jsp");

    } else {

    response.sendRedirect("board-login.jsp");

    }

    }

    }

    else

    {

    response.sendRedirect("board-title.jsp");

    }

    }

    }

    }

    WriteServlet.java(新增留言)

    package board;

    import javax.servlet.RequestDispatcher;

    import javax.servlet.ServletContext;

    import javax.servlet.ServletException;

    import javax.servlet.annotation.WebServlet;

    import javax.servlet.http.*;

    import java.io.IOException;

    import java.text.SimpleDateFormat;

    import java.util.ArrayList;

    import java.util.Date;

    import java.util.List;

    @WebServlet(name = "WriteServlet",urlPatterns = "/write.do")

    public class WriteServlet extends HttpServlet {

    //messages列表中存放Message类对象

    public List messages = new ArrayList();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/html;charset=utf-8");

    ServletContext context = request.getServletContext();

    HttpSession session = request.getSession();

    //用户名存储到session中

    String username =(String)session.getAttribute("username");

    String title = request.getParameter("title");

    String text = request.getParameter("text");

    //获取当前时间

    SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss");

    Date date = new Date(System.currentTimeMillis());

    String time = formatter.format(date);

    //在messages列表中添加留言对象

    messages.add(new Message(title,time,username,text));

    context.setAttribute("messages",messages);

    String list = new String();

    //list中存放留言用户名+留言标题,标题为链接,可跳转到留言具体信息,并传参title

    list = username+":"+""+title+"";

    String lists = new String();

    //将留言标题列表信息存到上下文对象

    if(context.getAttribute("lists")!=null){

    lists = context.getAttribute("lists") + list + "
    ";

    }

    else{

    lists = list + "
    ";

    }

    context.setAttribute("lists", lists);

    request.setAttribute("lists", lists);

    //转发

    RequestDispatcher dispatcher = request.getRequestDispatcher("/board-title.jsp");

    dispatcher.forward(request, response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    }

    MessageServlet.java

    package board;

    import com.sun.net.httpserver.HttpContext;

    import javax.servlet.RequestDispatcher;

    import javax.servlet.ServletContext;

    import javax.servlet.ServletException;

    import javax.servlet.annotation.WebServlet;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import java.io.IOException;

    import java.io.PrintWriter;

    import java.util.ArrayList;

    import java.util.List;

    @WebServlet(name = "MessageServlet",urlPatterns = "/MessageServlet")

    public class MessageServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/html;charset=utf-8");

    ServletContext context = request.getServletContext();

    List messages = new ArrayList();

    //获取列表

    messages = (List)context.getAttribute("messages");

    //获取链接中的参数title

    String title =request.getParameter("title");

    String name = new String();

    String date = new String();

    String text = new String();

    //遍历列表,查找该title的具体信息

    for(Message message : messages){

    if((message.getTitle()).equals(title)){

    name = message.getUsername();

    date = message.getTime();

    text = message.getText();

    title = message.getTitle();

    request.setAttribute("name",name);

    request.setAttribute("title",title);

    request.setAttribute("text",text);

    request.setAttribute("date",date);

    break;

    }

    }

    //将留言信息转发到board-message.jsp

    RequestDispatcher dispatcher = request.getRequestDispatcher("/board-message.jsp");

    dispatcher.forward(request, response);

    }

    }

    (以上仅为部分代码)

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    更多相关内容
  • JAVA实现QQ登录、注册等功能

    万次阅读 多人点赞 2022-05-09 19:54:29
    实现功能具体如下: 1、登录功能 2、注册功能 3、是否隐藏密码的选择以及实现功能 4、选择性别功能 5、密码与确认密码功能 6、登录页面实时展示当前的时间 7、当登录时用户名与密码在数据库中没有相匹配的...

    本文主要应用的技术有:GUI、JDBC、多线程

     实现的功能具体如下:

    1、登录功能

    2、注册功能

    3、是否隐藏密码的选择以及实现功能

    4、选择性别功能

    5、密码与确认密码功能

    6、登录页面实时展示当前的时间

    7、当登录时用户名与密码在数据库中没有相匹配的数据,则会跳转到注册页面上去。

    8、同样,注册完毕后,数据会运用JDBC将数据写入数据库中,然后跳转回登录页面。

     登录页面:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.sql.*;
    import java.time.LocalTime;
    
    public class JDBC_登录功能 {
        public static void main(String[] args) {
            guitext3 gt=new guitext3();
           new Thread(new time1(gt.time)).start();//启动线程
    
        }
    }
    class guitext3 {
        JFrame jf;
        JLabel l1,l2,time;
        JTextField f1;
        JPasswordField f2;
        JButton jb1,jb2;
        JCheckBox jc;
        public guitext3() {
            jf = new JFrame("QQ登录窗口");
            jf.setSize(320,250);
            jf.setLocation(700,300);//设置窗口每次启动都显示在屏幕正中央
            jf.setLayout(null);
            Font font = new Font("仿宋", Font.BOLD, 20);//设置统一的字体,让代码更加整洁美观
            l1 = new JLabel("用户名:");
            l1.setBounds(10,10,100,40);
            l1.setFont(font);
            f1 = new JTextField(null,20);
            f1.setBounds(90,15,180,30);
            f1.setFont(font);
            l2 = new JLabel("密  码:");
            l2.setBounds(8,50,100,40);
            l2.setFont(font);
            f2=new JPasswordField(null,20);
            f2.setBounds(90,55,180,30);
            f2.setEchoChar('*');//设置密码的外显为*
            f2.setFont(font);
            jc=new JCheckBox("显示密码");
            jc.setBounds(230,130,80,40);
            jc.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {//被选中
                        f2.setEchoChar((char) 0);
                    } else {
                        f2.setEchoChar('*');
                    }
                }
            });
            ActionListener listener=new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
    
                }
            };
            jc.addActionListener(listener);
            jb1 = new JButton("登录");
            jb1.setBounds(30,100,80,40);
            time=new JLabel();
            time.setBounds(30,150,140,40);
            time.setFont(font);
            //匿名内部类
            jb1.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    Statement st=null;
                    Connection con=null;
                    ResultSet rs=null;
                    try {
                        //注册驱动
                        Class.forName("com.mysql.cj.jdbc.Driver");
                        //这里的3306/后跟的是数据库名
                        //获取数据库连接
                        String url="jdbc:mysql://localhost:3306/students?serverTimezone=GMT%2B8";
                        //通过DriverManager完成注册
                        con= DriverManager.getConnection(url,"root","123");//你自己的数据库用户名和密码
                        //执行SQL语句
                        String sql="select * from student";//from 后跟表名
                        st=con.createStatement();
                        rs=st.executeQuery(sql);
                boolean flag=false;
                while(rs.next()){
                    //如果输入的用户名和密码与数据库中的用户和对应的密码相同,则弹出“登录成功!”的窗口
                    if(f1.getText().equals(rs.getString(1))&&f2.getText().equals(rs.getString(2))){
                        JOptionPane.showMessageDialog(null, "登录成功!");
                        flag=true;//登陆成功后将标记改为true方便确认
                        break;
                    }
                }
                if(flag==false){//如果标记为false,则表示用户名和密码在数据库中未找到,弹出“登录失败!请注册账户!”的窗口
                    JOptionPane.showMessageDialog(null, "登录失败!请注册账户!");
                    f1.setText(null);//清空用户栏
                    f2.setText(null);//清空密码栏
                    //这个账号不存在,需要注册,跳转到注册窗口
                    guitext4 gt=new guitext4();
                    jf.dispose();//关闭窗体,释放所有资源
                }
                    } catch (ClassNotFoundException ex) {
                        ex.printStackTrace();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }
            });
            jb1.setFont(font);
            jb2 = new JButton("退出");
            jb2.setBounds(150,100,80,40);
            //匿名内部类
            jb2.addMouseListener(new MouseAdapter() {
                //重写鼠标点击事件
                public void mouseClicked(MouseEvent e) {//如果点击了退出窗口,则弹出“退出成功!”的窗口
                    JOptionPane.showMessageDialog(null, "退出成功!");
                    //系统退出
                    System.exit(0);
                }
            });
            jb2.setFont(font);
            //将这些按钮和文本等加入到窗体中
            jf.add(l1);
            jf.add(f1);
            jf.add(l2);
            jf.add(f2);
            jf.add(jb1);
            jf.add(jb2);
            jf.add(time);
            jf.add(jc);
            jf.setVisible(true);//让组件显示
        }
    }
    //写一个时间线程类
    class time1 implements Runnable{
        JLabel time;//方便传参
        public time1(JLabel time) {
            this.time = time;
        }
        public void run(){
            while (true) {
                try {
                    Thread.sleep(1000);//休眠1秒
                    LocalTime time=LocalTime.now();//获取当前时间
                    this.time.setText(time.toString());//设置JLabel文本
                    //SimpleDateFormat t = new SimpleDateFormat ("HH:mm:ss");//格式化时间,把时间格式化为时:分:秒
                   // this.time.setText(t.format(time));//给标签添加内容,即时间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

     注册页面:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.sql.*;
    
    public class JDBC_注册功能 {
        public static void main(String[] args) {
            guitext4 gt=new guitext4();
        }
    }
    class guitext4{
        JFrame jf;
       // JPanel jp;
        JLabel l1,l2,l3;
        JTextField f1;
        JPasswordField f2,f3;
        JButton jb1,jb2;
        JRadioButton jr1,jr2;
        JCheckBox jc;
        public guitext4() {
            jf = new JFrame("QQ注册窗口");
            jf.setSize(320,280);//设置窗体大小
            jf.setLocation(700,300);//设置窗口每次启动都显示在屏幕正中央
            jf.setLayout(null);
           // jp = new JPanel();
            Font font = new Font("仿宋", Font.BOLD, 20);//设置统一的字体,让代码更加整洁美观
            l1 = new JLabel("用户名:");
            l1.setBounds(10,10,100,40);
            l1.setFont(font);
            f1 = new JTextField(null,20);
            f1.setBounds(90,15,180,30);
            f1.setFont(font);
                l2 = new JLabel("密  码:");
                l2.setBounds(8, 50, 100, 40);
                l2.setFont(font);
                f2 = new JPasswordField(null, 20);
                f2.setBounds(90, 55, 180, 30);
                f2.setEchoChar('*');//设置密码的外显为*
                f2.setFont(font);
                l3 = new JLabel("确认密码:");
                l3.setBounds(8, 88, 130, 40);
                l3.setFont(font);
                f3 = new JPasswordField(null, 20);
                f3.setBounds(120, 95, 160, 30);
                f3.setEchoChar('*');//设置密码的外显为*
            jc=new JCheckBox("显示密码");//创建一个复选按钮
            jc.setBounds(230,130,80,40);
            jc.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {//被选中
                        f2.setEchoChar((char) 0);//显示原本的数据
                        f3.setEchoChar((char)0);//显示原本的数据
                    } else {
                        f2.setEchoChar('*');//设置密码的外显为*
                        f3.setEchoChar('*');//设置密码的外显为*
                    }
                }
            });
                    f3.setFont(font);
                    ButtonGroup group = new ButtonGroup();
                    //创建两个单选按钮
                    jr1 = new JRadioButton("男");
                    jr1.setBounds(70, 130, 80, 40);
                    jr1.setFont(font);
                    jr2 = new JRadioButton("女");
                    jr2.setBounds(150, 130, 80, 40);
                    jr2.setFont(font);
                    //将两个单选按钮加入到同一个ButtonGroup组中
                    group.add(jr1);
                    group.add(jr2);
                    //实现监听接口
                    ActionListener listener = new AbstractAction() {
                        @Override
                        //actionPerformed==>发生动作时调用
                        public void actionPerformed(ActionEvent e) {
    
                        }
                    };
                    jr1.addActionListener(listener);
                    jr2.addActionListener(listener);
                    jc.addActionListener(listener);
                    jb1 = new JButton("注册");
                    jb1.setBounds(50, 170, 80, 40);
                    //匿名内部类
                    jb1.addMouseListener(new MouseAdapter() {
                        public void mouseClicked(MouseEvent e) {
                            PreparedStatement ps = null;//PreparedStatement==>表示预编译的SQL语句的对象。
                            // SQL语句已预编译并存储在PreparedStatement对象中。
                            Connection con = null;//Connection==>与特定数据库的连接
                            try {
                                //注册驱动
                                Class.forName("com.mysql.cj.jdbc.Driver");
                                //这里的3306/后跟的是数据库名
                                //获取数据库连接
                                String url = "jdbc:mysql://localhost:3306/students?serverTimezone=GMT%2B8";
                                //通过DriverManager完成注册
                                con = DriverManager.getConnection(url, "root", "123");//你自己数据库的用户名和密码
                                //执行SQL语句
                                String sql = "insert into student(username,password,sex) values(?,?,?)";
                                ps = con.prepareStatement(sql);
                                if(f1.getText().length()!=0){
                                    //注:这里的所有getText()都不能写成!=null
                                    ps.setString(1, f1.getText());
                                }else{
                                    JOptionPane.showMessageDialog(null, "姓名不能为空!");//弹出窗口
                                }
                                if(f2.getText().length()!=0) {
                                    ps.setString(2, f2.getText());
                                }else{
                                    JOptionPane.showMessageDialog(null, "密码不能为空!");
                                }
                                if(jr1.isSelected()||jr2.isSelected()) {//如果选择男或者女,就存入数据库。
                                    if (jr1.isSelected()) {//isSelected()==>判断按钮有没有被选中
                                        ps.setString(3, jr1.getText());//选中男,则将sex=男添加到数据
                                    }
                                    if (jr2.isSelected()) {
                                        ps.setString(3, jr2.getText());//选中女,则将sex=女添加到数据
                                    }
                                }else{//否则弹出窗口提醒“请选择性别!”
                                    JOptionPane.showMessageDialog(null, "请选择性别!");
                                }
                            } catch (ClassNotFoundException ex) {
                                ex.printStackTrace();
                            } catch (SQLException ex) {
                                ex.printStackTrace();
                            }
                            if (new String(f2.getPassword()).equals(new String(f3.getPassword()))) {//如果密码与确认密码一致
                                if (new String(f2.getPassword()).equals(new String(f3.getPassword()))&&f1.getText().length()!=0&&f2.getText().length()!=0
                                        &&(jr1.isSelected()||jr2.isSelected())) {//如果密码与确认密码一致,用户名和密码不为空并且选择了性别,则注册成功
                                    JOptionPane.showMessageDialog(null, "注册成功!");
                                    //注册成功后跳转到登录窗口
                                    guitext3 gt = new guitext3();
                                    jf.dispose();//关闭窗体,释放所有资源
                                    try {
                                        int i = ps.executeUpdate();//将注册的账户存储到数据库中
                                    } catch (SQLException ex) {
                                        ex.printStackTrace();
                                    }
                                }
                            } else {
                                JOptionPane.showMessageDialog(null, "注册失败!密码与确认密码不一致!");
                                f2.setText(null);//清空密码
                                f3.setText(null);//清空确认密码
                            }
                        }
                    });
                    jb1.setFont(font);
                    jb2 = new JButton("退出");
                    jb2.setBounds(170, 170, 80, 40);
                    //匿名内部类
                    jb2.addMouseListener(new MouseAdapter() {
                        public void mouseClicked(MouseEvent e) {
                            JOptionPane.showMessageDialog(null, "退出成功!");
                            //系统退出
                            System.exit(0);
                        }
                    });
                    jb2.setFont(font);
                    jf.add(l1);
                    jf.add(f1);
                    jf.add(l2);
                    jf.add(f2);
                    jf.add(l3);
                    jf.add(f3);
                    jf.add(jr1);
                    jf.add(jr2);
                    jf.add(jc);
                    jf.add(jb1);
                    jf.add(jb2);
                    // jf.add(jp);
                    jf.setVisible(true);
                }
            }

     登录页面运行结果:

     faa4b668b0684aa190fbf4230d5b1c50.png

     注册页面运行结果:

     94c8fc0e52a8440e80ec729716f35e4e.png

     是否隐藏密码效果图:

    50fc842306794501a0c5ae40b6897663.png ee5aeb93f2b041babac9c4611ebb6871.png

     

    展开全文
  • 超详细带你用Java实现QQ的聊天功能

    万次阅读 多人点赞 2022-05-21 13:25:17
    超详细带你用Java实现QQ的聊天功能 步骤: 1.定义JFrame窗体中的组件 2.在构造方法中初始化窗口的组件 3.使用网络编程完成数据的链接(TPC,UDP 协议) 4.实现"发送”按钮的监听点击事件 5.实现“回车键”发送数据...

    38051ee198e84322bd29f5d555caaf31.png

    f0b5ea346cd149e48ceec5cb44cedd9b.gif#pic_center

    个人名片:

    🐼作者简介:一名在校生
    🐻‍❄️个人主页:hmm.
    🕊️系列专栏:零基础学java ----- 重识c语言
    🐓每日一句:只要还有明天,今天就永远是起跑点。


     前言:🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊


    最近有许多小伙伴问小新有没有好用的刷题网站,想提升一下自我能力**</font>
    >**经过小新缜密的思考与亲身体验,推荐超实用的**🎉(点击访问牛客网)🎉
    >*里面用丰富的大厂面试真题、各类算法由易到难层层递进、专项题库应有尽有,还不快来体验体验**🎏🎏🎏
     

    第一步:完成界面搭建🐓

    6091766aa0904e5fbe51cc24bead6491.png

    要求:

    • 创建两个窗口:一个客户端,一个服务端,完成代码书写
      步骤:

    1.定义JFrame窗体中的组件:文本域,滚动条,面板,文本框,按钮

     //属性
        //文本域
        private JTextArea jta;
        //滚动条
        private JScrollPane jsp;
        //面板
        private JPanel jp;
        //文本框
        private JTextField jtf;
        //按钮
        private JButton jb;
    
    
    2.在构造方法中初始化窗口的组件:
    
     //构造方法
        public ServerChatMain(){
            //初始化组件
            jta = new JTextArea();
            //设置文本域默认不可编辑
            jta.setEditable(false);
            //注意:需要将文本域添加到滚动条中,实现滚动效果
            jsp =new JScrollPane(jta);
            //初始化面板
            jp = new JPanel();
            jtf = new JTextField(10);
            jb=new JButton("发送");
            //注意:需要将文本框与按钮添加到面板中
            jp.add(jtf);
            jp.add(jb);
    
    
    1. 注意:需要将滚动条与面板全部添加到窗体中,继承了窗体的属性,这里this就是窗体
     this.add(jsp, BorderLayout.CENTER);//BorderLayout--边框布局
            this.add(jp,BorderLayout.SOUTH);
    

    4.设置设置”标题“,大小,位置,关闭,是否可见

       //注意:需要设置”标题“,大小,位置,关闭,是否可见
            this.setTitle("QQ聊天服务端");
            this.setSize(400,300);
            this.setLocation(700,300);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭,程序就退出
            this.setVisible(true);//设置窗体可见
        }
    

    这样我们就完成了服务端的QQ聊天界面窗口搭建:
    注意:JTextArea文本域是不可以书写的
    a6cf00c315d1499dbcaa704c96a8d38f.png
    客户端与服务端代码类似,这里就不一一展示了

    书写完毕代码,运行效果如下图:

    32bf5b06843c4c34964daa68ddb44033.png


    afdc987b6bef4dfbb31fc38f805cb23d.png

    第二步:TPC通信的思路与步骤🐻‍❄️

    使用网络编程完成数据点的传输(TCP,UDP协议)

    TCP协议🐶

    TCP 是面向连接的运输层协议。应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接
    每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的(一对一)
    TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达
    TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据
    面向字节流。TCP 中的“流”指的是流入到进程或从进程流出的字节序列
    4a76e73a354a4b75bca59c0eb13b5782.png
    b1ee168f384d4d419db72cd683b00bc8.png

    TCP 服务端 具体步骤(客户端类似)🐮

    具体步骤:

    •    1.创建一个服务端的套接字
      
    •     2.等待客户端连接
      
    •    3.获取socket通道的输入流(输入六是实现读取数据的,一行一行读取)BufferedReader->readLine();
      
    •     4.获取socket 通道的输出流(输出流实现写出数据,也是写一行换一行,刷新)BufferedWriter->newLine();
      
    •     5.关闭socket 通道
      

    TCP通信步骤代码实现:🐸

     try {
                //1.创建一个服务端的套接字
                ServerSocket serverSocket = new ServerSocket(8888);
    
                //2.等待客户端连接
               Socket socket = serverSocket.accept();
    
                //3.获取socket通道的输入流(输入六是实现读取数据的,一行一行读取)BufferedReader->readLine();
                //InputStream in = socket.getInputStream();
               BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //4.获取socket 通道的输出流(输出流实现写出数据,也是写一行换一行,刷新)BufferedWriter->newLine();
                //当用户点击发送按钮的时候写出数据
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    
                //循环读取数据并拼接到文本域
                String line = null;
               while((line = br.readLine())!=null){
                   //将读取的数据拼接到文本域中显示
                   jta.append(line+System.lineSeparator());
               }
    
    
                //5.关闭socket 通道
                serverSocket.close();
    
            }catch (IOException e) {
                e.printStackTrace();
            }
    
    

    点击发送按钮实现数据的传输🐺

     @Override
        public void actionPerformed(ActionEvent actionEvent) {
            System.out.println("发送按钮被点击了");
        }
    

    步骤:

    1.获取文本框中发送的内容
    2.拼接需要发送的数据内容
    3.自己也要显示
    4.发送
    5.清空文本框内容

    @Override
        public void actionPerformed(ActionEvent actionEvent) {
            //System.out.println("发送按钮被点击了");
            //1.获取文本框中发送的内容
            String text = jtf.getText();
            //2.拼接需要发送的数据内容
            text = "服务端对客户端说:"+text;
            //3.自己也要显示
            jta.append(text);
            //4.发送
            try {
                bw.write(text);
                bw.newLine();//换行刷新
                bw.flush();
                //5.清空文本框内容
                jtf.setText("");
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
        }
    
    

    680886e93e04472bbf1732e71b4cff82.gif#pic_center

    第三步:实现回车键发送数据(客户端类似)🐳

    首先要实现一个接口

    public class ClientChatMain extends JFrame implements ActionListener, KeyListener {
    
    @Override
        public void keyPressed(KeyEvent e) {
    
            //回车键
            // System.out.println(e);
            //发送数据到socket 同道中
            if(e.getKeyCode()==KeyEvent.VK_ENTER) {
            sendDataToSocket();
        }
    

    e1f9fe1f69bd4d3b94c348a124630b49.gif#pic_center

    全部代码:🐲

    服务端:

    package com.ithmm.chat;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Properties;
    
    //说明:如果一个类,需要有界面的显示,那么这个类就需要继承JFrame,此时,该类可以被成为一个窗体类
    /*步骤:
         1.定义JFrame窗体中的组件
         2.在构造方法中初始化窗口的组件
         3.使用网络编程完成数据的链接(TPC,UDP  协议)
         4.实现"发送”按钮的监听点击事件
         5.实现“回车键”发送数据
     */
    public class ServerChatMain extends JFrame implements ActionListener, KeyListener {
        public static void main(String[] args) {
    
            //调用构造方法
            new ServerChatMain();
        }
    
        //属性
        //文本域
        private JTextArea jta;
        //滚动条
        private JScrollPane jsp;
        //面板
        private JPanel jp;
        //文本框
        private JTextField jtf;
        //按钮
        private JButton jb;
        //输出流(成员变量)
        private BufferedWriter bw = null;
        //服务端的端口号
        //private static int serverPort;
    
        //使用static静态方法读取外部京台文件
        //static代码块特点:1.在类加载的时候自动执行
        //特点2:一个类会被加载一次,因此静态代码块在程序中仅会被执行一次
    
        /*static{
            Properties prop = new Properties();
    
            try {
                //加载
                prop.load(new FileReader("chat.properties"));
    
                //给属性赋值
                Integer.parseInt(prop.getProperty("serverPort"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }*/
        //构造方法
        public ServerChatMain(){
            //初始化组件
            jta = new JTextArea();
            //设置文本域默认不可编辑
            jta.setEditable(false);
            //注意:需要将文本域添加到滚动条中,实现滚动效果
            jsp =new JScrollPane(jta);
            //初始化面板
            jp = new JPanel();
            jtf = new JTextField(10);
            jb=new JButton("发送");
            //注意:需要将文本框与按钮添加到面板中
            jp.add(jtf);
            jp.add(jb);
    
            //注意:需要将滚动条与面板全部添加到窗体中,继承了窗体的属性,这里this就是窗体
            this.add(jsp, BorderLayout.CENTER);//BorderLayout--边框布局
            this.add(jp,BorderLayout.SOUTH);
    
            //注意:需要设置”标题“,大小,位置,关闭,是否可见
            this.setTitle("QQ聊天服务端");
            this.setSize(400,300);
            this.setLocation(700,300);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭,程序就退出
            this.setVisible(true);//设置窗体可见
    
            /**************** TCP   服务端    Start *********************/
            //给发送按钮绑定一个监听点击事件
            jb.addActionListener(this);
            //给文本框绑定一个键盘点击事件
            jtf.addKeyListener(this);
    
            try {
                //1.创建一个服务端的套接字
                ServerSocket serverSocket = new ServerSocket(8888);
    
                //2.等待客户端连接
               Socket socket = serverSocket.accept();
    
                //3.获取socket通道的输入流(输入六是实现读取数据的,一行一行读取)BufferedReader->readLine();
                //InputStream in = socket.getInputStream();
               BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //4.获取socket 通道的输出流(输出流实现写出数据,也是写一行换一行,刷新)BufferedWriter->newLine();
                //当用户点击发送按钮的时候写出数据
                bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    
                //循环读取数据并拼接到文本域
                String line = null;
               while((line = br.readLine())!=null){
                   //将读取的数据拼接到文本域中显示
                   jta.append(line+System.lineSeparator());
               }
    
    
                //5.关闭socket 通道
                serverSocket.close();
    
            }catch (IOException e) {
                e.printStackTrace();
            }
    
            /**************** TCP   服务端    end  *********************/
        }
    
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            //System.out.println("发送按钮被点击了");
           sendDataToSocket();
        }
        //行为
        @Override
        public void keyPressed(KeyEvent e) {
    
            //回车键
            // System.out.println(e);
            //发送数据到socket 同道中
            if(e.getKeyCode()==KeyEvent.VK_ENTER) {
                sendDataToSocket();
            }
        }
        //定义一个方法,实现将数据发送到socket通道中
        private void sendDataToSocket(){
            //1.获取文本框中发送的内容
            String text = jtf.getText();
            //2.拼接需要发送的数据内容
            text = "服务端对客户端说:"+text;
            //3.自己也要显示
            jta.append(text+System.lineSeparator());
            //4.发送
            try {
                bw.write(text);
                bw.newLine();//换行刷新
                bw.flush();
                //5.清空文本框内容
                jtf.setText("");
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        @Override
        public void keyTyped(KeyEvent keyEvent) {
    
        }
    
    
    
        @Override
        public void keyReleased(KeyEvent keyEvent) {
    
        }
    
    
    
    }
    
    

    客户端:

    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    import java.util.Properties;
    
    //说明:如果一个类,需要有界面的显示,那么这个类就需要继承JFrame,此时,该类可以被成为一个窗体类
    /*步骤:
         1.定义JFrame窗体中的组件
         2.在构造方法中初始化窗口的组件
     */
    
    public class ClientChatMain extends JFrame implements ActionListener, KeyListener {
        public static void main(String[] args) {
    
            //调用构造方法
            new ClientChatMain();
        }
    
        //属性
        //文本域
        private JTextArea jta;
        //滚动条
        private JScrollPane jsp;
        //面板
        private JPanel jp;
        //文本框
        private JTextField jtf;
        //按钮
        private JButton jb;
        //s输出流
        private BufferedWriter bw =null;
        //客户端的IP地址
       // private static String clientIp;
        //客户端的port端口号
    
       // private static int clientPort;
    
        //静态代码块加载外部配置文件
       /* static{
          Properties prop = new Properties();
            try {
                prop.load(new FileReader("chat.properties"));
                clientIp = prop.getProperty("clientIp");
                clientPort =Integer.parseInt( prop.getProperty("clientPort"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }*/
        //构造方法
        public ClientChatMain(){
            //初始化组件
            jta = new JTextArea();
            //设置文本域默认不可编辑
            jta.setEditable(false);
            //注意:需要将文本域添加到滚动条中,实现滚动效果
            jsp =new JScrollPane(jta);
            //初始化面板
            jp = new JPanel();
            jtf = new JTextField(10);
            jb=new JButton("发送");
            //注意:需要将文本框与按钮添加到面板中
            jp.add(jtf);
            jp.add(jb);
    
            //注意:需要将滚动条与面板全部添加到窗体中,继承了窗体的属性,这里this就是窗体
            this.add(jsp, BorderLayout.CENTER);//BorderLayout--边框布局
            this.add(jp,BorderLayout.SOUTH);
    
            //注意:需要设置”标题“,大小,位置,关闭,是否可见
            this.setTitle("QQ聊天客户端");
            this.setSize(400,300);
            this.setLocation(700,300);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭,程序就退出
            this.setVisible(true);//设置窗体可见
    
            /**************** TCP   客户端    Start *********************/
    
            //给发送按钮绑定一个监听点击事件
            jb.addActionListener(this);
            //给文本框绑定一个键盘键
            jtf.addKeyListener(this);
            try {
                //1.创建一个客户端的套接字(尝试连接)
    
                Socket socket = new Socket("127.0.0.1",8888);
    
                //2.获取socket通道的输入流
               BufferedReader br =  new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //3.获取socket 通道的输出流
              bw =  new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                //循环读取数据,并拼接到文本域
               String line = null;
               while((line = br.readLine())!=null){
                   jta.append(line + System.lineSeparator());
               }
    
                //4.关闭socket 通道
                socket.close();
            }catch (Exception e){
                e.printStackTrace();
            }
    
            /**************** TCP   客户端    end  *********************/
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
           sendDataToSocket();
        }
        //行为
        @Override
        public void keyPressed(KeyEvent e) {
            //回车键
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //发送数据
                sendDataToSocket();
            }
    
        }
        private void sendDataToSocket(){
            //1.获取文本框需要发送内容
            String text = jtf.getText();
    
            //2.拼接内容
    
            text = "客户端对服务端说"+text;
    
            //3.自己显示
            jta.append(text+System.lineSeparator());
    
            try {
                //4.发送
                bw.write(text);
                bw.newLine();//换行加刷新
                bw.flush();
    
                bw.write(text);
                //5.清空
                jtf.setText("");
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
        @Override
        public void keyTyped(KeyEvent e) {
    
        }
    
        @Override
        public void keyReleased(KeyEvent e) {
    
        }
    
    }
    
    

    接口类:

    public interface addActistener {
    }
    
    public interface addActionListener {
    }
    

    90918e157acf4f61bbb7f4f478223ed9.gif#pic_center
    兄弟们,三连支持一下!!!

    展开全文
  • java实现收藏功能

    千次阅读 多人点赞 2020-08-18 16:17:00
    java实现收藏功能 需求分析 分析: 1.要求用户必须登录,否则提示 2.第次点击,表示收藏成功,收藏数+1,显示蓝色星星 3.第二次点击,表示取消收藏操作,收藏数-1,显示白色星星 ------------------------------------...

    java实现收藏功能

    在这里插入图片描述

    需求分析
    分析:
        1.要求用户必须登录,否则提示
    	2.第一次点击,表示收藏成功,收藏数+1,显示蓝色星星
    	3.第二次点击,表示取消收藏操作,收藏数-1,显示白色星星
    -----------------------------------------------------------------------
    	核心问题:当前请求时收藏操作,还是取消收藏操作
    	[这类型的操作,称之为有状态的操作]
    解决方案:第一次请求过来时,留下一个记号,第二次请求时候,根据记号有无决定收藏还是取消收藏
    	引出新问题:记号怎么设计
    ----------------------------------------------------------
        记号应该存在缓存中,而不是mongodb/mysql
    原因:现在所有操作都是缓存里面操作,也即:使用redis来缓存集合,此时需要思考,key值与value值设计
    

    在这里插入图片描述

    步骤分析
    //判断是否存在以用户id为key的key键,返回list	
    	1.创建一个收藏接口,传攻略sid,获取用户uid
    	2.请求进入之后需要判断是收藏操作还是取消收藏操作
    	3.通过uid拼接出用户收藏的攻略id集合(记号)的key
    	4.判断key是否存在,如果存在,直接获取sidList,如果不存在,返回空集合list
    //判断是取消收藏还是收藏操作,返回boolean类型
    	5.判断当前传入的sid是否在sidList(攻略id集合)1>如果不在,当前请求为收藏请求,获取vo对象,收藏数+1,将sid添加到sidList(攻略id集合)
            2>如果在,当前请求为取消收藏请求,获取vo对象,收藏数-1,将sid从sidList(攻略id集合)移除
    	6.更新sidList(攻略id集合),更新vo对象
    	
    //从redis中取出来的集合字符串转换为集合
    	JSON.parseArray(集合字符串,String.class)
    
    具体实现
       //获取收藏数id集合
        @Override
        public List<String> getStrategyFavorStatisVO(String userId, String sid) {
            //拼接key
            String key = RedisKeys.USER_STRATEGY_FAVOR.join(userId);
            //判断redis中有没有该key
            List<String> list = new ArrayList<>();
            if (template.hasKey(key)) {
                //如果存在,就直接获得key对应的收藏数集合
                String sidListStr = template.opsForValue().get(key);
                //将字符串解析为集合
                list = JSON.parseArray(sidListStr, String.class);
            }
            //如果不存在,创建list,缓存到redis中,并返回空集合
            return list;
        }
    
        //判断集合中是否存在攻略id
        @Override
        public boolean isExistsSid(String uid, String sid) {
            List<String> list = this.getStrategyFavorStatisVO(uid, sid);
            StrategyStatisVO statisVO = this.getStrategyStatisVO(sid);
            //判断是否在存在传过来的攻略id
            if (!list.contains(sid)) {
                //不存在,收藏操作,收藏数+1,添加到list集合中
                statisVO.setFavornum(statisVO.getFavornum() + 1);
                list.add(sid);
            } else {
                //存在,取消收藏操作,收藏数-1,并从list集合中移除
                statisVO.setFavornum(statisVO.getFavornum() - 1);
                list.remove(sid);
            }
            //更新vo对象,更新list
            this.setStrategyStatisVO(statisVO);
            template.opsForValue().set(RedisKeys.USER_STRATEGY_FAVOR.join(uid), JSON.toJSONString(list));
            return list.contains(sid);
        }
    ------------------------------------------------------------------------------------
    	//获取vo对象
     	@Override
        public StrategyStatisVO getStrategyStatisVO(String sid) {
            //使用枚举类拼接key
            String key = RedisKeys.STRATEGY_STATIS_VO.join(sid);
            StrategyStatisVO statisVO = new StrategyStatisVO();
            //判断vo对象是否存在,即判断key是否存在
            if (!template.hasKey(key)) {
                //不存在,初始化数据,将数据查出来,然后赋值给vo对象,最后存起来
                Strategy strategy = strategyService.get(sid);
                BeanUtils.copyProperties(strategy, statisVO);
                statisVO.setStrategyId(sid);
                template.opsForValue().set(key, JSON.toJSONString(statisVO));
            } else {
                //存在,获取vo对象
                String VO = template.opsForValue().get(key);
                statisVO = JSON.parseObject(VO, StrategyStatisVO.class);
            }
            return statisVO;
        }
    	//设置vo对象,将vo对象存储到redis数据库中
    	 @Override
        public void setStrategyStatisVO(StrategyStatisVO statisVO) {
            String key = RedisKeys.STRATEGY_STATIS_VO.join(statisVO.getStrategyId());
            template.opsForValue().set(key, JSON.toJSONString(statisVO));
        }
    
    小结
       1.关于收藏功能的实现其实与点赞功能类似,都是点击一下,数据+1,再点击一下,数据-1
       2.关于这类问题,我们称之为有状态的操作,就是第一次操作之后,我们需要留下一个记号(key键,value-list集合)
       3.例如上面的操作,我们用key键作为标记,key键通过当前用户id拼接,站在用户角度
       4.先判断key键是否存在,存在,就通过key取出list集合,不存在,返回空集合给前端,这个是用来显示收藏颜色的
       5.当我们点击操作时,只需要判断传进来的攻略id是否存在集合中即可
       6.如果不在,当前请求为收藏请求,获取vo对象,收藏数+1,将sid添加到sidList(攻略id集合)
         如果在,当前请求为取消收藏请求,获取vo对象,收藏数-1,将sid从sidList(攻略id集合)移除
       7.最后更新sidList(攻略id集合),更新vo对象即可
    
    展开全文
  • java实现点赞(顶)功能

    千次阅读 2020-08-18 16:54:12
    java实现点赞(顶)功能 需求分析 分析: 1.必须先登录,否则提示 2.第次点赞(顶),点赞操作,点赞数+1,提示顶成功 2.第二次点赞(顶),没有操作,提示今天顶过了 --------------------------------------------- 核心...
  • 基于Java的商品管理功能实现

    千次阅读 2019-07-18 20:12:48
    完成一个电商系统的商品模块功能,商品类包含以下属性:商品ID,商品名,类别名,单价,库存量,产地,计量单 位等信息,要求实现商品管理功能具体如下: 商品添加 商品列表 查询指定id的商品 根据商品id删除...
  • 实现原理:将学生对象存入集合中(把集合作为临时数据库),然后通过对集合中学生对象进行操作,实现功能、创建学生类(class Student) 二、创建管理系统的接口(interface MangerStore) 管理系统接口中...
  • 本资源是本人前面发过的一个局域网聊天工具的升级版。主要在界面上进行了美化,并添加了语音聊天的功能具体功能有: 1.采用了全新的界面风格(新增) 2.实现了基本文字聊天功能 3.实现了基本文件传送功能 4.实现了...
  • JAVA实现QQ登录、注册、修改密码等功能(美化版)

    万次阅读 多人点赞 2022-05-12 10:26:24
    本文用Java的==awt组件==、==swing组件==以及==数据库JDBC==写了一个==仿QQ登录==的界面,具体演示如下图所示,包括三个页面,分别**是登录窗口(MainFrame)**、**注册窗口(RegisterUI)**和**忘记密码窗口...
  • 首先,先上老师给的文档,具体代码在后面   1、安装数据库服务器mysql和数据库客户端navicat。 (1)数据库服务器为绿色版,直接将附件mysql解压即可。 (2)数据库服务启动:双击解压目录里的mysql_start_utf8...
  • Java实现图片的旋转功能

    千次阅读 2021-11-11 23:29:20
    主要就是利用Java swing中的一些东西实现的,这程序就是让图片在GUI页面中显示出来并且点击按钮可以让图片实现旋转的功能。 二:代码 import java.awt.*; import javax.swing.*; import java.awt.event.*; import ...
  • Java编写简单计算器--实现

    万次阅读 多人点赞 2020-12-06 10:56:39
    本文用Java的swing来实现一个简单计算器,主要内容为图形用户界面GUI的实现以及运算表达式核心算法的设计编写。 程序运行环境为Windows10 ,编译环境为MyEclipse 。 一、具体功能: 1、:输入,输出 1)、输入:...
  • JAVA实现邮箱注册功能

    万次阅读 2018-11-27 10:49:55
    现在我们来看下是如何具体实现一个邮箱注册的功能。 第一步、先选用个邮箱作为实例 以QQ邮箱为例,开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,具体步骤如下图 第二步、在maven中添加一个jar包,名字...
  • Java+MySQL实现评论功能设计开发

    万次阅读 多人点赞 2018-08-13 09:39:52
    Java+MySQL实现评论功能设计开发 、背景 项目初始版本上线,有时间写点东西记录一下项目中的心得体会,通过这项目学习了很多,要写下来的有很多,先从评论功能开始吧。由于项目需要增加评论功能,之前并无此...
  • Java中定时任务的6种实现方式,你知道几种?

    万次阅读 多人点赞 2021-08-05 07:36:11
    几乎在所有的项目中,定时任务的使用都是不可或缺的,如果使用不当甚至会造成资损。还记得多年前在做金融系统时,出款业务是通过定时任务对外...可以先创建一个thread,然后让它在while循环里一直运行着,通过sleep方法
  • 我们日常使用的软件或者网站,大部分都在使用短信业务,比如 注册 、 验证码功能 。还有一些特定的业务需要发送短信通知用户等。有了需求就会有平台提供服务,国内有很多互联网公司都提供短信业务,比如阿里、腾讯、...
  • java如何实现封装

    千次阅读 2021-03-22 17:53:09
    Java中类的封装是如何实现的封装是将对象的信息隐藏在对象内部,禁止外部程序直接访问... 继承和多态都明白些,就是封装理解不上去,老师没关于这个问题,我想举一个例子: lz如果你接触过老的面向过程的编程, 以前...
  • Java定时任务的三种实现方式

    万次阅读 2021-03-22 17:52:09
    前言现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时...java 系统中主要有三种方式来实现定时任务:Timer和TimerTaskScheduledExecutorService三方框架 Quar...
  • JAVA项目实现授权 (二)

    万次阅读 多人点赞 2018-10-10 09:53:42
    JAVA项目实现授权 (二)    本篇文章只写具体实现方法,如果想看实现的介绍,可以参考JAVA项目实现授权 () ,这里详细说明了一下实现步骤。
  • java中,接口是一切实现方法的来源,任何实现都离开不了接口,那么,一个标准的java接口写法是怎样的呢?下面,就让小编带你一起了解一下吧。(一)接口1、什么是接口。接口就是一些方法特征的集合。一些功能的定义。...
  • 基于JavaSwing ATM取款机系统的设计和实现

    千次阅读 多人点赞 2021-08-15 08:29:46
    人们有的要取钱,有的要存钱,可是只能去银行,而银行的遍布并不是很广,它可能在人流密集度比较大的地方会设立,或者稍大范围内设立一个,但是对于比较偏远地区的人们,无疑造成了非常大的困难。那么,如何来解决这...
  • Java设计一个简单的计算器,要求实现整数和小数的加减乘除和清屏。
  • java实现延时处理

    千次阅读 2021-12-07 15:37:02
    业务场景: 1.数据库轮询 1.1 思路 1.2 实现 1.2.1在启动类上添加注解@EnableScheduling,如下图所示: ...3.2.2 具体实现 3.3 优缺点 4.redis缓存 4.1 利用redis的zset 4.1.1 添加redis依赖 4...
  • Java实现简单登录,注册功能(集合版)

    万次阅读 多人点赞 2019-11-12 20:27:39
    使用集合来实现一个用户登录,注册功能,没有实现JFrame窗口,只是简单的实现了一下功能。 仅供参考! 代码如下: package cn.itcast.Dao; import cn.itcast.pojo.User; /** * 这是针对用户进行操作的...
  • 剖根问底:Java 不能实现真正泛型的原因是什么?

    千次阅读 多人点赞 2021-07-30 10:16:37
    今天我来给大家讲一下,Java 不能实现真正泛型的原因是什么? 本文已同步至 GitHub 《教妹学 Java》专栏,风趣幽默,通俗易懂,对 Java 初学者亲切友善,么么哒????,内容包括 Java 语法、Java 集合框架、Java 并发...
  • Java Swing实现JList添加JCheckBox复选框

    千次阅读 2018-06-27 21:42:50
    最近因项目需要具体在JList 框内添加复选框, 网上找了下相关例子,进行下改造,记录一下,这需要实现功能的话就必须重写复选框JCheckBox。 话不多说我们贴上段图 大概书写一番,Jlist单纯添加数据进去之后大概...
  • JavaEE中,考勤(签到签退)功能实现

    万次阅读 多人点赞 2019-05-20 15:23:03
    2、在相关的jsp页面添加jsp按钮,用于签到与签退,并添加id属性 3、在servlet层编写签到相关方法 4、在service实现类编写签到的逻辑方法 5、dao层实现类 6、在原来的jsp页面中,编写ajax请求,处理从servlet...
  • JAVA登录界面的实现

    万次阅读 多人点赞 2018-06-16 09:42:57
    学习JAVA的过程中,登录界面是多数人第一个实现的小程序。今天我们就来做一下登录界面。当然在动手写代码之前我们要先做一些准备工作,我们要先了解JAVA提供的图形界面类有哪些,以及有哪些常用的组件类和辅助类。 ...
  • JAVA实现饭店点菜系统详解

    千次阅读 多人点赞 2021-08-03 16:27:54
    JAVA实现饭店点菜系统 在这个暑假,我会将一些 网络上比较经典的 java 编程...在点菜系统中,我们为了方便 饭店添加菜谱 ,我们要使用一个list 集合 ,可以改变长度大小。 每一个 菜品 都是一个对象 我们要封装起来,
  • java+redis 实现搜索附近人功能

    千次阅读 2017-03-01 15:08:53
    最近在做一款交友软件的APP,现在有一个功能需要实现搜索附近的人。后来发现用redis 的GEO功能实现非常简。先说一下设计思路,每个用户在登陆的时候都会添加一下经纬度,这个是APP端获取的,然后设置一下这个经纬度...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 451,266
精华内容 180,506
关键字:

java的一个添加功能的具体实现