精华内容
下载资源
问答
  • 双向链表是想对于单链表而言,区别就是你单链表只有一个指针索引,而双向链表拥有两个索引,指针和后指针,构成双向连接: 单向链表:只有指向下一个结点引用(后驱); 双向链表:既有指向下一个结点...

    双向链表

    双向链表是想对于单链表而言的,区别就是你单链表只有一个指针索引,而双向链表拥有两个索引,前指针和后指针,构成双向连接:

    单向链表:只有指向下一个结点的引用(后驱);

    双向链表:既有指向下一个结点的引用(后驱),也有指向上一个结点的引用(前驱);

    优点

    1. 双向链表在查找元素的时候,速度比之单向链表会更快
    2. 拥有前驱后驱,操作更灵活

    缺点

    1. 增加删除结点操作更繁琐一些
    2. 占用的资源更多,数据存储率相比单向链表更低(生产中使用单链表比双链表更多)

    功能实现:

    class Nodes {
    	Object data;// 链表中的数据
    	Nodes pre; // 前一节点的索引
    	Nodes next;// 下一节点的索引
    
    	public Nodes(Object data) {
    		this.data = data;// 取的元素
    	}
    }
    
    public class LinkList {
    
    	Nodes head;
    	int size;
    	/*
    	 * 定义打印函数
    	 */
    
    	public void print() {
    		Nodes p = head;
    		while (p != null) {
    			System.out.print(p.data + "<->");
    			p = p.next;
    		}
    		System.out.println();
    	}
    
    	/**
    	 * 添加元素
    	 */
    	public Nodes add(Object data) {
    		Nodes newNode = new Nodes(data);
    		if (size == 0) {
    			head = newNode;
    		} else {
    			Nodes target = head;
    			while (target.next != null) {
    				target = target.next;
    			}
    			target.next = newNode;
    			newNode.pre = target;
    		}
    		size++;
    		return newNode;
    	}
    
    	/**
    	 * 插入元素
    	 */
    	public Nodes insert(int index, Object data) {
    		if (index >= size) {
    			return null;
    		}
    		Nodes newNode = new Nodes(data);
    		if (index == 0) {
    			newNode.next = head;
    			head.pre = newNode;
    			head = newNode;
    		} else {
    			Nodes target = head;
    			int pos = 0;
    			while (pos != index) {
    				target = target.next;
    				pos++;
    			}
    			newNode.pre = target.pre;
    			newNode.pre.next = newNode;
    			newNode.next = target;
    		}
    		size++;
    		return newNode;
    	}
    
    	/**
    	 * 删除指定位置元素
    	 * 
    	 * @return
    	 */
    	public void delete(int index) {
    		if (index >= size) {
    			throw new IllegalStateException("无效索引");
    		}
    		if (index == 0) {
    
    			head = head.next;
    		} else {
    			Nodes target = head;
    			int pos = 0;
    			while (pos != index) {
    				target = target.next;
    				pos++;
    			}
    			target.pre.next = target.next;
    		}
    		size--;
    	}
    
    	/**
    	 * 查询元素
    	 */
    	public void find(Object data) {
    		Nodes target = head;
    		while (target.next != null) {
    			if (data.equals(target.data)) {
    				System.out.println("含该值");
    			} else {
    				target = target.next;
    			}
    		}
    		if (target.next == null && data.equals(target.data)) {
    			System.out.println("含该值");
    		}
    		System.out.println("不含该值");
    	}
    
    	public static void main(String[] args) {
    		LinkList list = new LinkList();
    		// 插入结点
    		list.add(10000);
    		list.add(10010);
    		list.add(10086);
    		list.add(12580);
    		list.add(12306);
    		System.out.println("初始链表:");
    		list.print();
    		list.insert(3, 12316);
    		System.out.println("插入链表:");
    		list.print();
    		list.delete(3);
    		System.out.println("删除指定索引链表:");
    		list.print();
    		System.out.println("查询链表:");
    		list.find(12110);
    
    	}
    }

    展开全文
  • 两天在调研kafka权限这一块,根据网上一些资料通过命令窗口也能实现用户创建啊、权限查看、赋予、删除等。。 但是关于java整合kafka权限这一块资料少之又少,所以通过这些天学习决定把自己整理资料...

    一、概述

    	前两天在调研kafka权限这一块,根据网上的一些资料通过命令窗口也能实现用户的创建啊、权限的查看、赋予、删除等。。
    	但是关于java整合kafka权限这一块的资料少之又少,所以通过这些天的学习决定把自己整理的资料分享给大家。
    

    二、kafka添加鉴权启动

    	这里没有做zookeeper的验证,因为懒。
    	所以这里正常启动zookeeper,通过admin用户启动kafka,在这里不出kafka权限配置的教程,因为如果连这步也走不到,下面就别看了。
    

    三、添加用户曲线救国

    	相信这里一大部分人没有查到java如何动态添加用户。
    	其实这个规则是存在zookeeper上的所以kafka并没有提供Api,所以我又查阅资料发现可以通过java代码来调用linux脚本来实现这个操作。
    
    1. 在linux服务器上添加脚本
    #!/bin/bash
    SERVER=$1
    USER=$2
    PASSWORD=$3
    
    if [ "x$SERVER" = "x" ] || [ "x$USER" = "x" ] || [ "x$PASSWORD" = "x" ]; then
        echo "usage: $0 <server:port> <user> <password>"
        exit
    fi
    /opt/software/kafka_2.11-2.2.1/bin/kafka-configs.sh --zookeeper $SERVER --alter --add-config "SCRAM-SHA-256=[iterations=8192,password=$PASSWORD],SCRAM-SHA-512=[password=$PASSWORD]" --entity-type users --entity-name $USER
    
    1. 参数说明(这不就可以通过前端页面传值了吗,)
    参数 说明
    zookeepers zookeeper服务器ip:端口
    username 用户名
    password 密码
    1. java代码
      这段代码要和你的脚本放在一台服务器上哈,因为要读取你的脚本
    /**
         * 创建用户
         * 可以传递参数 用户名 密码
         */
        @Test
        public void createUser() throws IOException {
            // broker地址
            String zookeepers = "192.168.10.23:2181";
            // 用户名
            String username = "amao";
            // 密码
            String password = "amao";
    		
    		
    		// 这里是脚本地址2
            ProcessBuilder pb = new ProcessBuilder("bin/create-acl-kafka-user.sh", zookeepers , username, password);
            // 这里是jdk的配置,找到jdk的配置粘过来就行了
            pb.environment().put("PATH", "/usr/local/java/jdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin");
            // 这里也是脚本地址2  (代码运行之后 就是  脚本地址2+脚本地址1 = 脚本地址)
            ProcessBuilder directory = pb.redirectErrorStream(true)
                    .directory(new File("/opt/software/kafka_2.11-2.2.1"));
            directory.start();
        }
    

    四、给用户赋予权限

    以下参数均可作为传参,实例代码中直接写死
    
    参数 说明
    bootstrapServers kafa服务器ip+端口
    user 要获取权限的用户名
    aclOperation 权限(读、写…)
    topic 权限作用于此队列
    groupName 消费者组,消费者需要此参数
    不多bb,直接上java代码
    
    	/**
         * 分配权限
         * 可以传递参数 服务器地址、用户名、权限类型、队列名、消费者组名
         */
        @Test
        public void competence() throws Exception {
            // kafka服务器ip+端口,多个可用逗号隔开
            private String bootstrapServers="192.168.10.23:9092";
            // 用户名
            private String user="cxy";
            // 权限
            private AclOperation aclOperation=AclOperation.READ;
            // 队列名
            private String topic = "test1";
            // 消费者组名
            private String groupName = "testConsumer"; 
            
            Map<String, Object> configs = new HashMap<>();
            // broker地址,多个用逗号分割
            configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
            // 加密信息设置
            configs.put("security.protocol", "SASL_PLAINTEXT");
            configs.put("sasl.mechanism", "SCRAM-SHA-512");
            // 登录broker的账户 admin是管理员
            configs.put("sasl.jaas.config",
                    "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"admin\" password=\"admin\";");
            KafkaAdmin admin = new KafkaAdmin(configs);
    
            AdminClient adminClient = null;
            try {
                adminClient = AdminClient.create(admin.getConfig());
                // principal:User:test2是需要赋予权限的帐号
                // host:主机 (*号即可)
                // operation:权限操作
                // permissionType:权限类型
                AccessControlEntry ace = new AccessControlEntry("User:"+user, "*", aclOperation, AclPermissionType.ALLOW);
                // resourceType:资源类型(topic)
                // name:topic名称
                // patternType:资源模式类型
                ResourcePattern topic = new ResourcePattern(ResourceType.TOPIC, topic, PatternType.LITERAL);
                ResourcePattern group = new ResourcePattern(ResourceType.GROUP, groupName, PatternType.LITERAL);
    			// 给队列权限
                AclBinding topicAcl = new AclBinding(topic, ace);
                // 给消费者组权限,生产者去掉就行了
                AclBinding groupAcl = new AclBinding(group, ace);
    
                ArrayList<AclBinding> ab = new ArrayList<>();
                ab.add(topicAcl);
                ab.add(groupAcl);
                // 多个权限赋予可以传list
                adminClient.createAcls(ab);
            } catch (Exception e) {
                throw new Exception(e);
            } finally {
                if (ObjectUtil.isNotNull(adminClient)) {
                    adminClient.close();
                }
            }
        }
    

    五、重置offset

    参数 说明
    bootstrapServers kafa服务器ip+端口
    topic 队列
    groupName 消费者组
    offset 偏移量
    partitionInfo 分区
    /**
         * 重置offset前,消息监听方需要暂停服务
         * 可以传递参数 服务器地址、队列名、偏移量、消费者组、分区
         */
        @Test
        public void resetOffset() {
             // kafka服务器ip+端口,多个可用逗号隔开
            private String bootstrapServers="192.168.10.23:9092";
            // 队列名
            private String topic = "test1";
            // 消费者组名
            private String groupName = "testConsumer"; 
            // 偏移量
            private long offset = 1500L;
            // 分片
            private short partitionInfo = 1;
            
            
            Properties props = new Properties();
            // 服务器ip:端口号,集群用逗号分隔
            props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
            // 消费者指定组,名称可以随意,注意相同消费组中的消费者只能对同一个分区消费一次
            props.put(ConsumerConfig.GROUP_ID_CONFIG, groupName);
            // 是否启用自动提交,默认true
            props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
            //重启时未消费得数据不再进行消费
            props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
            // key反序列化指定类
            props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
            // value反序列化指定类,注意生产者与消费者要保持一致,否则解析出问题
            props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
            props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 1);
            props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 30000);
            // 加密信息设置
            props.put("security.protocol", "SASL_PLAINTEXT");
            props.put("sasl.mechanism", "SCRAM-SHA-512");
            props.put("sasl.jaas.config",
                    "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"admin\" password=\"admin\";");
            KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
            // 所有分区都改
            // List<PartitionInfo> aa = consumer.partitionsFor(topic);
            // Map map = new HashMap();
            // for (int i = 0; i < aa.size(); i++) {
            //   map.put(new TopicPartition(topic, partitionInfo), new OffsetAndMetadata(offset));
            // }
            map.put(new TopicPartition(topic, partitionInfo), new OffsetAndMetadata(offset));
            consumer.commitSync(map);
            System.out.println("设置完成~~~~~~" + aa.size());
        }
    

    创作不易大家记得点赞啊!!

    展开全文
  • 一篇文章讲解了通过Servlet获取所提交的数据,这篇文章将详细讲解MyEclipse+Servlet+JSP实现火车票管理系统的查询页面、模糊查询、修改车票信息、删除车票等操作。基础性文章,希望对读者有所帮助 ,尤其是我的...
  • 一篇文章讲解了通过Servlet获取所提交的数据,这篇文章将详细讲解MyEclipse+Servlet+JSP实现火车票管理系统的查询页面、模糊查询、修改车票信息、删除车票等操作。基础性文章,希望对读者有所帮助 ,尤其是我的...

    本系列文章是作者暑假给学生进行实训分享的笔记,主要介绍MyEclipse环境下JSP网站开发,包括JAVA基础、网页布局、数据库基础、Servlet、前端后台数据库交互、DAO等知识。
    前一篇文章讲解了通过Servlet获取所提交的数据,这篇文章将详细讲解MyEclipse+Servlet+JSP实现火车票管理系统的查询页面、模糊查询、修改车票信息、删除车票等操作。基础性文章,希望对读者有所帮助 ,尤其是我的学生。

    参考前文:
    Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门
    Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交
    Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中
    Java+MyEclipse+Tomcat (四)Servlet提交表单和数据库操作
    Java+MyEclipse+Tomcat (五)DAO和Java Bean实现数据库和界面分开操作
    Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

    前文:
    [JSP暑假实训] 一.MyEclipse安装及JAVA基础知识
    [JSP暑假实训] 二.JSP网站创建及Servlet实现注册表单提交、计算器运算
    [JSP暑假实训] 三.MySQL数据库基本操作及Servlet网站连接显示数据库信息

    下载地址:https://download.csdn.net/download/eastmount/11293780


    一.查询操作

    1.新建Web工程,命名为“test0706_hcp”。

    2.在工程中新建“imgs”文件夹,并放入图片及连接MySQL的jar包。

    3.创建数据库hcp,新建表info,SQL语句如下所示:

    -- ----------------------------
    -- Table structure for `info`
    -- ----------------------------
    DROP TABLE IF EXISTS `info`;
    CREATE TABLE `info` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `start` varchar(40) DEFAULT NULL,
      `end` varchar(40) DEFAULT NULL,
      `name` varchar(40) DEFAULT NULL,
      `starttime` datetime DEFAULT NULL,
      `price` float DEFAULT NULL,
      `other` varchar(100) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of info
    -- ----------------------------
    INSERT INTO `info` VALUES ('1', 'guiyang', 'kunming', 'T61', '2019-06-29 12:00:00', '56', null);
    INSERT INTO `info` VALUES ('2', 'guiyang', 'kaili', 'T88', '2019-06-29 12:00:00', '26', null);
    INSERT INTO `info` VALUES ('3', '贵阳', '西安', 'T98', '2019-07-04 12:00:00', '126', null);
    INSERT INTO `info` VALUES ('4', '贵阳', '武汉', 'T34', '2019-07-04 12:00:00', '86', null);
    INSERT INTO `info` VALUES ('5', '贵定', '西安', 'T51', '2019-07-04 12:00:00', '134', null);
    INSERT INTO `info` VALUES ('6', '昆明', '武汉', 'T21', '2019-06-29 12:00:00', '123', null);
    

    4.修改index.jsp网页布局,代码如下:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>火车票管理系统</title>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
      </head>
      
      <body>
        <div align="center">
        		<img src="imgs/bg.jpg" height="200" width="80%" /><br />
        		<hr width="90%" color="red" size="3" />
        		<h2>火车票查询</h2>
        		
        		<form method="post" action="index.jsp">
    	    		起始地: <input type="text" name="start" size="20" />
    	    		发车时间:<input type="date" name="sj" size="20" />
    	    		<input type="submit" name="sub" value="查询">
    	    	</form>
        		<br /><br />
        		
        		<table border="2" width="80%">
        			<tr>
        				<td>序号</td><td>起始地</td><td>目的地</td>
        				<td>车次</td><td>时间</td><td>价格</td><td>备注</td>
        				
        			</tr>
        		</table>
        		<br />
        		<hr width="90%" color="red" size="3" />
        		©2019 YXZ 使用订票系统前必读 意见反馈 贵ICP证0000号 <br />
        		贵州财经大学信息学院杨秀璋及16级软工所有 贵财0000000000001号 
        </div>
      </body>
    </html>
    

    此时运行结果如下图所示:

    5.在 index.jsp 中添加连接数据库的JDBC代码,并进行起始地模糊查询、时间查询。

    完整代码如下:

    <%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>火车票管理系统</title>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
      </head>
      
      <body>
        <div align="center">
        		<img src="imgs/bg.jpg" height="200" width="80%" /><br />
        		<hr width="90%" color="red" size="3" />
        		<h2>火车票查询</h2>
        		
        		<%
    	    		//驱动的名称
    				String driverName = "com.mysql.jdbc.Driver";
    				//数据库用户名密码
    				String userName = "root";
    				String userPwd = "123456";
    				//数据库名字
    				String dbName = "hcp";
    				//表名
    				String tableName = "info";
    				//拼接字符串链接数据库
    				String url = "jdbc:mysql://localhost:3306/" + dbName + "?user="
    						+ userName + "&password=" +userPwd +
    						"&useUnicode=true&characterEncoding=UTF-8";
    				//链接数据库
    				Class.forName("com.mysql.jdbc.Driver").newInstance();
    				
    				//设置编码方式
    				request.setCharacterEncoding("UTF-8");
    				response.setCharacterEncoding("UTF-8");
    				
    				//获取查询的值
    				String start = request.getParameter("start");
    				System.out.println(start);
    				String sj = request.getParameter("sj");
    				System.out.println(sj);
    				
    				//SQL查询
    				ResultSet re;
    				Connection con = DriverManager.getConnection(url);
    				Statement statement = con.createStatement();
    				String sql;
    				
    				//起始地为空判断
    				if(start==null||start=="") {
    					if(sj==null||sj=="") { //查询所有结果
    						sql = "select * from " + tableName;
    						System.out.println(sql);
    						re = statement.executeQuery(sql);
    					} else { //按时间查询
    						sql = "select * from " + tableName + 
    						    " where date(starttime)='" + sj+ "';";
    						System.out.println(sql);
    						re = statement.executeQuery(sql);
    					}
    				}
    				else {
    					if(sj==null||sj=="") { //按起始点模糊查询
    						sql = "select * from " + tableName + 
    						    " where start like '%" + start + "%';";
    						System.out.println(sql);
    						re = statement.executeQuery(sql);
    					} else { //两个字段查询
    						sql = "select * from " + tableName + 
    						    " where start like '%" + 
    						    start + "%' and date(starttime)='" + sj+ "';";
    						System.out.println(sql);
    						re = statement.executeQuery(sql);
    					}
    				}
    				
        		%>
        		
        		<table border="2" width="80%">
        			<tr>
        				<td>序号</td><td>起始地</td><td>目的地</td>
        				<td>车次</td><td>时间</td><td>价格</td><td>备注</td>
        				
        			</tr>
        			
        			<%
        				while(re.next()) {
        					
        			%>
        			
        			<tr>
        				<td><% out.print(re.getString(1)); %></td>
        				<td><% out.print(re.getString(2)); %></td>
        				<td><% out.print(re.getString(3)); %></td>
        				<td><% out.print(re.getString(4)); %></td>
        				<td><% out.print(re.getString(5)); %></td>
        				<td><% out.print(re.getString(6)); %></td>
        				<td><% out.print(re.getString(7)); %></td>
        			</tr>
    				
    				<%
        				} //end while
        			
    	    			//关闭连接
    			        re.close();  
    			        statement.close();  
    			        con.close();  
    				%>
        			
        		</table>
        		
        		<br />
        		<hr width="90%" color="red" size="3" />
        		©2019 YXZ 使用订票系统前必读 意见反馈 贵ICP证0000号 <br />
        		贵州财经大学信息学院杨秀璋及16级软工所有 贵财0000000000001号 
        </div>
      </body>
    </html>
    

    初始化显示结果如下所示:
    select * from info;

    模糊查询结果:
    select * from info where start like ‘%贵%’;

    时间查询:
    select * from info where date(starttime)=‘2019-06-29’;

    多字段查询:
    select * from info where start like ‘%贵阳%’ and date(starttime)=‘2019-07-04’;

    写到这里,查询功能基本实现,接下来补充常见的错误:
    (1)中文编码错误是最常见的错误,需要全部设置为“UTF-8”,包括数据库、JSP、JAVA等。

    (2)这里使用的传递参数为“post”方法,同时部分学生会出现SQL语句正常显示,但无反馈结果,此时设置url需要增加编码,如下:

    String url = "jdbc:mysql://localhost:3306/" + dbName + "?user="
    						+ userName + "&password=" +userPwd +
    						"&useUnicode=true&characterEncoding=UTF-8";
    

    (3)JAVA在调用SQL语句时,注意字符串拼接,建议同学们用 System.out.print 输出SQL语句,再观察其是否错误。尤其是from和where前后的空格、单引号等,其拼接代码如下:

    sql = "select * from " + tableName + " where start like '%" + 
    	   start + "%' and date(starttime)='" + sj+ "';";
    

    (4)while循环输出结果时,注意 { 和 } 之间的内容,它们把table布局嵌入其间。

    <%
        while(re.next()) {
    %>
        			<tr>
        				<td><% out.print(re.getString(1)); %></td>
        				<td><% out.print(re.getString(2)); %></td>
        				<td><% out.print(re.getString(3)); %></td>
        				<td><% out.print(re.getString(4)); %></td>
        				<td><% out.print(re.getString(5)); %></td>
        				<td><% out.print(re.getString(6)); %></td>
        				<td><% out.print(re.getString(7)); %></td>
        			</tr>	
    <%
        } //end while
        //关闭连接
    	re.close();  
    	statement.close();  
    	con.close();  
    %>
    

    二.删除操作

    1.继续修改 index.jsp 主页内容,如下所示:

    <table border="2" width="80%">
       			<tr align="center">
       				<td>序号</td><td>起始地</td><td>目的地</td>
       				<td>车次</td><td>时间</td><td>价格</td><td>备注</td>
       				<td>详情</td><td>删除</td><td>更新</td>
       			</tr>
       			<%
       				while(re.next()) {	
       			%>
       			<tr align="center">
       				<td><% out.print(re.getString(1)); %></td>
       				<td><% out.print(re.getString(2)); %></td>
       				<td><% out.print(re.getString(3)); %></td>
       				<td><% out.print(re.getString(4)); %></td>
       				<td><% out.print(re.getString(5)); %></td>
       				<td><% out.print(re.getString(6)); %></td>
       				<td><% out.print(re.getString(7)); %></td>
       				<td><a href="Show.jsp?id=<% out.print(re.getString(1)); %>">详情</a></td>
       				<td><a href="DeleteServlet?id=<% out.print(re.getString(1)); %>">删除</a></td>
       				<td><a href="Update.jsp?id=<% out.print(re.getString(1)); %>">更新</a></td>
       			</tr>
    			<%
       				} //end while
       			
        			//关闭连接
    		        re.close();  
    		        statement.close();  
    		        con.close();  
    			%>
       		</table>
    

    此时显示界面如下所示,注意 < a href=“DeleteServlet?id=<% out.print(re.getString(1)); %>”>删除</ a> 表示跳转到DeleteServlet页面,id是传递的参数,对应数据库火车票表的主键ID(序号)。

    2.创建DeleteServlet类,如下所示。

    3.接着在 DeleteServlet.java 中撰写代码,导入 java.sql. * 扩展包,并将连接数据库的代码复制到 doGet()函数中。它会提示如下所示错误,数据库相关操作需要放置在try/catch异常捕获中,双击它就能自动加载try-catch。

    完整代码如下所示,主要是doGet()函数:

    package servlet;
    
    import java.sql.*;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class DeleteServlet extends HttpServlet {
    	public DeleteServlet() {
    		super();
    	}
    
    	public void destroy() {
    		super.destroy(); // Just puts "destroy" string in log
    		// Put your code here
    	}
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		
    		//获取URL传递参数
    		int id = Integer.valueOf(request.getParameter("id"));
    		
    		//驱动的名称
    		String driverName = "com.mysql.jdbc.Driver";
    		//数据库用户名密码
    		String userName = "root";
    		String userPwd = "123456";
    		//数据库名字
    		String dbName = "hcp";
    		//表名
    		String tableName = "info";
    		//拼接字符串链接数据库
    		String url = "jdbc:mysql://localhost:3306/" + dbName + "?user="
    				+ userName + "&password=" +userPwd +
    				"&useUnicode=true&characterEncoding=UTF-8";
    	
    		//链接数据库
    		try {
    			Class.forName("com.mysql.jdbc.Driver").newInstance();
    			
    			//设置编码方式
    			request.setCharacterEncoding("UTF-8");
    			response.setCharacterEncoding("UTF-8");
    			
    			//SQL查询
    			ResultSet re;
    			Connection con = DriverManager.getConnection(url);
    			Statement statement = con.createStatement();
    			String sql = "delete from " + tableName + 
    				" where id='" + id + "'";
    			System.out.println(sql);
    			//执行SQL语句
    			statement.execute(sql);
    			
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    		out.println("<HTML>");
    		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    		out.println("  <BODY>");
    		out.println("<h2><a href='index.jsp'>返回</a></h2>");
    		out.println("  </BODY>");
    		out.println("</HTML>");
    		out.flush();
    		out.close();
    	}
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    		out.println("<HTML>");
    		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    		out.println("  <BODY>");
    		out.print("    This is ");
    		out.print(this.getClass());
    		out.println(", using the POST method");
    		out.println("  </BODY>");
    		out.println("</HTML>");
    		out.flush();
    		out.close();
    	}
    
    	public void init() throws ServletException {
    		// Put your code here
    	}
    }
    

    此时运行代码,点击“删除”操作,可能会报错误如下所示:

    这是因为跳转路径的问题,有两种处理方法:
    < td >< a href=“DeleteServlet?id=<% out.print(re.getString(1)); %>”>删除</ a></ td >

    方法一:修改 web.xml 文件中的URL访问路径,即除去 “servlet/” 字段。

    方法二:创建Servlet类时,设置它的URL访问路径,如下图所示。

    4.运行代码,成果实现删除功能。


    三.查看详情

    新建 Show.jsp 页面,编辑代码如下所示:

    <%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'Show.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    
      </head>
      
      <body>
        <div align="center">
       		<img src="imgs/bg.jpg" height="200" width="80%" /><br />
        		<hr width="90%" color="red" size="3" />
        		<h2>火车票信息更新</h2>
        		
        		<%
    	    		//驱动的名称
    				String driverName = "com.mysql.jdbc.Driver";
    				//数据库用户名密码
    				String userName = "root";
    				String userPwd = "123456";
    				//数据库名字
    				String dbName = "hcp";
    				//表名
    				String tableName = "info";
    				//拼接字符串链接数据库
    				String url = "jdbc:mysql://localhost:3306/" + dbName + "?user="
    						+ userName + "&password=" +userPwd +
    						"&useUnicode=true&characterEncoding=UTF-8";
    				//链接数据库
    				Class.forName("com.mysql.jdbc.Driver").newInstance();
    				
    				//设置编码方式
    				request.setCharacterEncoding("UTF-8");
    				response.setCharacterEncoding("UTF-8");
    				
    				//获取查询的值
    				String start = request.getParameter("start");
    				System.out.println(start);
    				String sj = request.getParameter("sj");
    				System.out.println(sj);
    				
    				//SQL查询
    				ResultSet re;
    				Connection con = DriverManager.getConnection(url);
    				Statement statement = con.createStatement();
    				int id = Integer.valueOf(request.getParameter("id"));
    				
    				String sql = "select * from " + tableName + " where id=" + id;
    				System.out.println(sql);
    				re = statement.executeQuery(sql);	
    				while(re.next()) {
        		%>
        		
        		<form action="index.jsp" method="get">
    	    		<table border="0" width="30%">
    	    			<tr align="left">
    	    				<td>车次</td>
    	    				<td><input type="text" name="upcc" readonly="readonly" 
    	    				    value="<% out.print(re.getString(2)); %>"></td>
    	    			</tr>
    	    			<tr align="left">
    	    				<td>起始点</td>
    	    				<td><input type="text" name="upstart" readonly="readonly"
    	    				    value="<% out.print(re.getString(3)); %>"></td>
    	    			</tr>
    	    			<tr align="left">
    	    				<td>目的地</td>
    	    				<td><input type="text" name="upend" readonly="readonly" 
    	    				    value="<% out.print(re.getString(4)); %>"></td>
    	    			</tr>
    	    			<tr align="left">
    	    				<td>时间</td>
    	    				<td><input type="text" name="uptime" readonly="readonly"
    	    				    value="<% out.print(re.getString(5)); %>"></td>
    	    			</tr>
    	    			<tr align="left">
    	    				<td>价格</td>
    	    				<td><input type="text" name="upprice" readonly="readonly"
    	    				    value="<% out.print(re.getString(6)); %>"></td>
    	    			</tr>
    	    			<tr align="left">
    	    				<td>备注</td>
    	    				<td><input type="text" name="upother" readonly="readonly"
    	    				    value="<% out.print(re.getString(7)); %>"></td>
    	    			</tr>
    	    			<tr align="center">
    	    				<td colspan="2"><input type="submit" name="upsub" value="返回"></td>
    	    			</tr>
    	    			<%
    	    				}
    	    			%>
    	    		</table>
        		</form>
    		<hr width="90%" color="red" size="3" />
        		©2019 YXZ 使用订票系统前必读 意见反馈 京ICP证030173号 <br />
        		贵州财经大学信息学院YXZ所有 京公网安备11000002000001号 
      	</div>
      </body>
    </html>
    

    运行结果如下图所示,均为只读。点击“返回”又继续返回主页,需要注意的是URL包含id值,即:
    http://desktop-2ptb11k:8080/test0706_hcp/Show.jsp?id=1

    PS:比如新闻详情页面,通常都会用这种方式,显示的结果直接用文本内容即可,而不像这里的input控件。


    四.修改操作

    1创建一个Update.jsp文件,然后添加如下代码,其中表单为:
    < form action=“UpdateServlet” method=“get” >。

    完整代码如下:

    <%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'Update.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    
      </head>
      
      <body>
          	<div align="center">
       		<img src="imgs/bg.jpg" height="200" width="80%" /><br />
        		<hr width="90%" color="red" size="3" />
        		<h2>火车票信息更新</h2>
        		
        		<%
    	    		//驱动的名称
    				String driverName = "com.mysql.jdbc.Driver";
    				//数据库用户名密码
    				String userName = "root";
    				String userPwd = "123456";
    				//数据库名字
    				String dbName = "hcp";
    				//表名
    				String tableName = "info";
    				//拼接字符串链接数据库
    				String url = "jdbc:mysql://localhost:3306/" + dbName + "?user="
    						+ userName + "&password=" +userPwd +
    						"&useUnicode=true&characterEncoding=UTF-8";
    				//链接数据库
    				Class.forName("com.mysql.jdbc.Driver").newInstance();
    				
    				//设置编码方式
    				request.setCharacterEncoding("UTF-8");
    				response.setCharacterEncoding("UTF-8");
    				
    				//获取查询的值
    				String start = request.getParameter("start");
    				System.out.println(start);
    				String sj = request.getParameter("sj");
    				System.out.println(sj);
    				
    				//SQL查询
    				ResultSet re;
    				Connection con = DriverManager.getConnection(url);
    				Statement statement = con.createStatement();
    				int id = Integer.valueOf(request.getParameter("id"));
    				
    				String sql = "select * from " + tableName + " where id=" + id;
    				System.out.println(sql);
    				re = statement.executeQuery(sql);	
    				while(re.next()) {
        		%>
        		
        		<form action="UpdateServlet" method="get">
        		<table border="0" width="30%">
        			<tr align="left">
        				<td>车次</td>
        				<td><input type="text" name="upcc" value="<% out.print(re.getString(2)); %>"></td>
        			</tr>
        			<tr align="left">
        				<td>起始点</td>
        				<td><input type="text" name="upstart" value="<% out.print(re.getString(3)); %>"></td>
        			</tr>
        			<tr align="left">
        				<td>目的地</td>
        				<td><input type="text" name="upend" value="<% out.print(re.getString(4)); %>"></td>
        			</tr>
        			<tr align="left">
        				<td>时间</td>
        				<td><input type="text" name="uptime" value="<% out.print(re.getString(5)); %>"></td>
        			</tr>
        			<tr align="left">
        				<td>价格</td>
        				<td><input type="text" name="upprice" value="<% out.print(re.getString(6)); %>"></td>
        			</tr>
        			<tr align="left">
        				<td>备注</td>
        				<td><input type="text" name="upother" value="<% out.print(re.getString(7)); %>"></td>
        			</tr>
        			<tr align="left">
        				<td colspan="2"><input type="hidden" name="id" value="<% out.print(re.getString(1)); %>"></td>
        			</tr>
        			<tr align="center">
        				<td><input type="submit" name="upsub" value="提交"></td>
        				<td><input type="reset" name="upreset" value="撤销"></td>
        			</tr>
        			<%
        				}
        			%>
        		</table>
        		</form> 
        		
    		<hr width="90%" color="red" size="3" />
        		©2019 YXZ 使用订票系统前必读 意见反馈 京ICP证030173号 <br />
        		贵州财经大学信息学院YXZ所有 京公网安备11000002000001号 
      </div>
      </body>
    </html>
    

    注意:隐藏了一个input控件作为id值获取,UpdateServlet中SQL语句需要通过它更新数据。

    2.此时运行结果如下图所示,其内容是可以替换的。

    比如修改信息如下所示,包括时间、票价、备注,点击“提交”按钮。

    其运行结果如下所示,这是因为Servlet还没有创建。

    3.创建UpdateServlet类,并添加相关代码,需要注意访问路径设置如下。

    package servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class UpdateServlet extends HttpServlet {
    
    	public UpdateServlet() {
    		super();
    	}
    
    	public void destroy() {
    		super.destroy(); // Just puts "destroy" string in log
    		// Put your code here
    	}
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		
    		//设置编码方式
    		request.setCharacterEncoding("UTF-8");
    		response.setCharacterEncoding("UTF-8");
    			
    		//驱动的名称
    		String driverName = "com.mysql.jdbc.Driver";
    		//数据库用户名密码
    		String userName = "root";
    		String userPwd = "123456";
    		//数据库名字
    		String dbName = "hcp";
    		//表名
    		String tableName = "info";
    		//拼接字符串链接数据库
    		String url = "jdbc:mysql://localhost:3306/" + dbName + "?user="
    				+ userName + "&password=" +userPwd +
    				"&useUnicode=true&characterEncoding=UTF-8";
    	
    		//链接数据库
    		try {
    			Class.forName("com.mysql.jdbc.Driver").newInstance();
    			
    			//获取URL传递参数 中文乱码??????????转换
    			int id = Integer.valueOf(request.getParameter("id"));
    			String upcc = new String(request.getParameter("upcc").getBytes("ISO-8859-1"), "UTF-8"); //车次
    			String upstart = new String(request.getParameter("upstart").getBytes("ISO-8859-1"), "UTF-8"); //起始点
    			String upend = new String(request.getParameter("upend").getBytes("ISO-8859-1"), "UTF-8"); //目的地
    			String uptime = new String(request.getParameter("uptime").getBytes("ISO-8859-1"), "UTF-8"); //时间
    			String upprice = new String(request.getParameter("upprice").getBytes("ISO-8859-1"), "UTF-8"); //价格
    			String upother =  new String(request.getParameter("upother").getBytes("ISO-8859-1"), "UTF-8"); //备注
    			System.out.println(upother);
    		
    			//SQL查询
    			Connection con = DriverManager.getConnection(url);
    			Statement statement = con.createStatement();
    			String sql = "update " + tableName + " set start='" + upstart 
    					+ "' , end='" + upend + "' , name='" + upcc 
    					+ "' , starttime='" + uptime + "' , price='" + upprice
    					+ "' , other='" + upother + "' where id=" + id + ";";
    			System.out.println(sql);
    			//执行SQL语句
    			statement.execute(sql);
    			
    			//关闭连接 
    	        statement.close();  
    	        con.close();
    			
    		} catch (InstantiationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		//重定向到
    		//response.sendRedirect("index.jsp");
    		PrintWriter out = response.getWriter();
    		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    		out.println("<HTML>");
    		out.println("  <HEAD><TITLE>A Servlet</TITLE>");
    		out.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />");
    		out.println("<HEAD>");
    		out.println("  <BODY>");
    		out.println ("<script language=javascript>alert('更新成功!!!');window.location='index.jsp'</script>");
    		out.println("  </BODY>");
    		out.println("</HTML>");
    		out.flush();
    		out.close();	
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    		out.println("<HTML>");
    		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    		out.println("  <BODY>");
    		out.print("    This is ");
    		out.print(this.getClass());
    		out.println(", using the POST method");
    		out.println("  </BODY>");
    		out.println("</HTML>");
    		out.flush();
    		out.close();
    	}
    
    	public void init() throws ServletException {
    		// Put your code here
    	}
    }
    

    此时的文件结果如下图所示:

    update info set start=‘武汉’ , end=‘T34’ , name=‘贵阳’ , starttime=‘2019-07-06 12:00:00.0’ ,
    price=‘188’ , other=‘这是一张很棒的火车票。’ where id=4;

    输出结果如下图所示:

    注意:GET方法可能存在中文编码错误,输出“???”,修改方法主要是request调用setCharacterEncoding(“UTF-8”)方法设置为UTF-8。同时,下面获取的值也转码成UTF-8。


    五.总结

    目前虽然实现了网站的功能,但其代码非常杂乱,JSP中嵌套这JAVA,JAVA中又嵌套着HTML,而我想实现的功能是:JSP就赋值布局,显示界面;Java就负责连接数据库、数据库增删改查,处理结果再返回给JSP中显示,而不是相互嵌套的。换句话说:JSP中点击“提交”按钮,TextBox中传递出发地,Java中接着请求,数据库查询,得到的结果再返回给JSP中显示。

    那怎么实现呢?
    接下来我们将介绍DAO和Java Bean对JDBC进行分层、模块化的最有效两个方法。DAO(数据库操作对象,Database Access Object)是JDBC下常用模式,DAO出现之前,操作数据库的代码与业务代码都出现在Servlet或者JSP中,不利用业务代码的分离。DAO出现后,所有与数据库相关的操作全被拿到了DAO层实现,Servlet或JSP只操作Java Bean或者DAP层,而DAO层值操作数据库。

    周末的深夜,呆在办公室准备明天的JAVA网站开发实训,不同的是,这次有学生陪伴。各行各业都很辛苦,996和5+2让我们更珍惜生活,学生也更应该抓住编程的时光。看到学生开始学会分享博客、分享知识,真的很高兴,又拉了一些人“入坑”,传道授业解惑,为之而努力。
    夜色已深,月光打在身上,勾勒出你看书时最美的侧脸,吹灭读书灯,一身都是月,任是寻常动人,想你了。接着在办公室写代码了,fighting

    (By:Eastmount 2019-07-06 夜9点 http://blog.csdn.net/eastmount/)

    展开全文
  • 双向链表也叫双链表,是链表一种,它每个数据结点中都有两个指针,分别指向直接...删除、插入同理,最后修改目标节点前后关系即可,以下是模拟实现的过程: package test; public class MyLinkedList&...

      双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。查询即从第一个节点,不断指向下一节点以便获得自己目标节点。删除、插入同理,最后修改目标节点的前后关系即可,以下是模拟实现的过程:

    package test;
    
    public class MyLinkedList<E> {
        
        //先初始化节点类
        private static class Node<E>{
            E element;//节点数据
            
            Node<E> pre;//上一个节点
            
            Node<E> next;//下一个节点信息
            
            public Node(E element,Node<E> next,Node<E> pre){
                this.element = element;
                this.pre = pre;
                this.next = next;
            }
        }
        
        private int size;//链表的大小
        
        private Node<E> first;//第一个节点
        
        private Node<E> last;//最后一个节点
        
        /**
         * 默认往链表尾部添加
         * @param e
         */
        public void add(E e){
            addAtLast(e);
        }
        
        /**
         * 往指定位置添加元素
         * @param e
         * @param index
         */
        public void add(E e,int index){
            //先检查是否越界
            checkRangeForAdd(index);
            if(index == size){//在尾部添加时
                addAtLast(e);
            }else{
                Node<E> curNode = node(index);
                addBeforeNode(e, curNode);
            }
        }
        
        /**
         * 根据index获取元素
         * @param index
         * @return
         */
        public E get(int index){
            //先检查是否越界
            checkRange(index);
            return node(index).element;
        }
        
        /**
         * 查找元素的下标
         * @param element
         * @return
         */
        public int indexOf(Object element){
            Node<E> cursor = first;
            int count = 0;
            while (null != cursor) {
                if(null != element){
                    if(element.equals(cursor.element)){
                        return count;
                    }
                }else{
                    if(null == element){//考虑到被查找的元素的为空的情况
                        return count;
                    }
                }
                
                cursor = cursor.next;
                count++;
            }
            
            return -1;
            
        }
        
        /**
         * 根据下标删除元素是,处理链表的双向关系
         * @param index
         * @return
         */
        private E deleteLink(int index){
            Node<E> node = node(index);
            E element = node.element;
            Node<E> preNode = node.pre;
            Node<E> nextNode = node.next;
            
            if(null == preNode){//删除的节点为第一个节点时
                first = nextNode;
            }else{
                preNode.next = nextNode;
                node.next = null;
            }
            
    
            if (nextNode == null) {//删除的为最后一个节点时
                last = preNode;
            }else{
                nextNode.pre = preNode;
                node.pre = null;
            }
            size--;
            node.element = null;
            return element;
            
        }
        
        /**
         * 根据index删除元素
         * @param index
         * @return
         */
        public E remove(int index){
            //检查数组下标是否越界
            checkRange(index);
            return deleteLink(index);
        }
        
        /**
         * 根据对象删除
         * @param o
         * @return
         */
        public boolean remove(Object o) {
            int index = indexOf(o);
            if (index < 0){
                return false;
            }
            deleteLink(index);
            return true;
        }
        
        /**
         * 检查是否越界
         * @param index
         */
        private void checkRange(int index) {
            if (index >= size || index < 0) {
                throw new IndexOutOfBoundsException("指定index超过界限");
            }
        }
        
        /**
         * 检查是否越界
         * @param index
         */
        private void checkRangeForAdd(int index) {
            if (index > size || index < 0) {
                throw new IndexOutOfBoundsException("指定index超过界限");
            }
        }
        /**
         * 在链表的末尾添加新元素
         * @param e
         */
        private void addAtLast(E e){
            
            Node<E> oldLast = last;
            
            //构造一个新节点
            Node<E> node = new Node<E>(e, null, last);
            last = node;
            if(null == oldLast){//新增元素是第一个元素时
                first = node;
            }else{//新增元素不是第一个元素时
                oldLast.next = node;
            }
            size ++;
        }
        
        /**
         * 在指定的元素前面添加一个新元素,维持双向的地址
         * @param e
         * @param curNode
         */
        private void addBeforeNode(E e,Node<E> curNode){
            Node<E> preNode = curNode.pre;
            Node<E> newNode = new Node<E>(e, curNode, preNode);
            
            if(null == preNode){//插入到第一个节点前时
                first = newNode;
            }else{//非第一个节点前时,需维护前一个节点的next指向
                preNode.next = newNode;
            }
            
            curNode.pre = newNode;
            size++;
        } 
        
        /**
         * 根据index查找元素,只能从头开始找或者从尾部开始找
         * @param index
         * @return
         */
        private Node<E> node(int index){
            Node<E> node;
            //采用二分查找的方式,将index与size/2的值进行比较,确定是从头开始找,还是从尾部开始找
            if (index < (size >> 1)) {//从头开始找
                node = first;
                for(int i =0 ; i < index; i++){
                    node = node.next;
                }
            }else{//从尾开始找
                node = last;
                for(int i = size -1; i > index; i--){
                    node = node.pre;
                }
                
            }
            
            return node;
        }
        
        /**
         * 链表的长度
         * @return
         */
        public int size(){
            return this.size;
        }
        
    
    }

     

    转载于:https://www.cnblogs.com/dengyulinBlog/p/7090269.html

    展开全文
  • java实现对文件内容读取,暂时未完善插入数据库部分 将内容写入到文本文件,暂时未完善从数据库查询部分 前置知识 IO流 Exception Eclipse/IDEA 等工具 JDBC/Hibernate/Mybatis/JPA 等 问题 配合定时任务,将...
  • 基于java电脑彩票销售管理系统设计与实现毕业论文文档+源码,电脑彩票销售管理系统主要用于实现彩票销售,电脑彩票销售管理系统设计与实现根据所需要功能, 划分为后台2个用户,即前台会员用户功能和系统...
  • word分词是一个Java实现的中文分词组件,提供了多种基于词典分词算法,并利用ngram模型来消除歧义。 能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。 同时提供了Lucene...
  • 类别管理:查询所有类别,添加、修改、删除商品类别 商品管理:查询所有商品,添加、删除商品 订单管理:显示所有订单,查询订单明细,受理、删除订单 销量管理:查看所有商品销量 留言管理:查看所有...
  • 这两个(设计一个类,实现接口,查询是否存在某个用户),(设计一个类,实现接口,修改某个用户密码中...输出查询修改结果。 <p><strong>3月28日21点截止</p>
  • 源代码及数据库获取链接: ...系统项目结构 系统功能分析 ...出租房屋信息管理系统的前三个功能模块都包含: 查询修改、删除、添加四个功能。 本系统登录人员为系统管理员:管理员可以进行出租人
  • 修改XML文档 本讲大纲 1修改节点 2删除节点 修改节点 在修改XML文档节点首先需要查询到该节点在dom4j组件中查询节点可以应用Element对象selectSingleNode)方法或selectNodes)方法来实现下面对这两种方法进行...
  • HashMap集合中储存是偶对象,即键值对应关系:key = value。在调用put()方法添加数据时,保存顺序并...当数据增大到一定量(未达到集合扩容条件),则变为红黑树形式储存,以提高查询等方面效率。 同...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     Java实现的FTP连接与数据浏览程序,实现实例化可操作窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...
  • HBase Java API

    2019-04-10 22:59:22
    本章, 我们继续接着上章内容, 完成Java实现上述功能. 前置条件 HBase Hadoop 正文 我们可以通过 HBase Client Java API 实现如下操作: 初始化 创建表 删除表 插入/修改数据 删除数据 查询...
  • 根据人查询他发布所有文章 前台文章轮播图连接 查看热门文章、热门评论 根据标签查询所有文章 发布文章、上传文章头图、文章头图切割比例上传 申请友链、点击友链、查看站内通知 后台 管理员登录、登录验证码、...
  • 9.5.7 练习:如何用Hibernate+Struts实现修改用户信息功能? 196 9.6 小结 197 9.7 参考资料 197 第十章 开发Spring应用 198 10.1 简介 198 10.1.1 Spring简介 198 10.1.2 MyEclipseSpring开发功能简介 200 10.2 ...
  • Java的aop实现,切面对mapper,两个数据源,例如以select开头使用读数据源,以insert开头使用写数据源,在mapper方法执行使用aop切换 shardingsphere框架实现,一个个人感觉不错框架,社区较为活跃,在mycat...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     Java实现的FTP连接与数据浏览程序,实现实例化可操作窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...
  • 自己写个人通讯录java代码完整版

    热门讨论 2012-10-01 15:53:39
    java个人通信录,具有图形界面,能实现对个人信息录入、查询、删除、修改、排序等功能,可以分别输出同学、朋友、同事、亲戚以及全体人员信息。 详情:个人通信录记录了同学(包含一起上学学校名称)、...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     Java实现的FTP连接与数据浏览程序,实现实例化可操作窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...
  • java源码包4

    千次下载 热门讨论 2013-04-20 11:31:44
     Java实现的FTP连接与数据浏览程序,实现实例化可操作窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...
  • |--订单管理 实现用户订单的查询,删除 ,发货 |--会员管理 实现会员的查询和删除 |--评价信息管理 实现评价信息的查询和删除 |--销售统计管理 |--彩票金额图表统计 图表统计 |--彩票销量排行统计 表格...
  • 引入quartz定时任务,可动态完成任务添加、修改、删除、暂停、恢复及日志查看等功能 引入API模板,根据token作为登录令牌,极大方便了APP接口开发 引入Hibernate Validator校验框架,轻松实现后端校验 引入云...
  • My-Blog : My Blog 是由 SpringBoot + Mybatis + Thymeleaf 等技术实现的 Java 博客系统,页面美观、功能齐全、部署简单及完善代码,一定会给使用者无与伦比体验。 uexam :一个非常不错考试系统!考试系统...
  • 基于JAVA的航空售票系统

    热门讨论 2012-12-07 10:44:19
    航空订票查询主要实现对票据信息种类添加、修改和删除功能。票据信息种类是系统内容最高级别,所以在添加、修改或删除票据信息时,也必须选择该票据信息所属票据信息种类。下面是票据信息种类添加、修改和...
  • 本教程为java开发桌面应用程序视频教程+案例源码,每一讲视频教程所对应源码都有,针对图书管理系统开发,一步一步讲解java桌面应用程序开发,开发环境为eclipse+mysql;最适合java入门级图形界面程序开发...
  • 通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行向或后向遍历,但是插入数据时只需要记录本项前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出...
  • 执行插入、删除时候只需要把插入节点的前一个节点位置信息和后一个节点位置信息修改即可。 1、双向链表结构如下 private static class Node<E> { E item; Node<E> next; Node<E> prev;

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 315
精华内容 126
关键字:

java实现修改前的查询

java 订阅