<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Java &#8211; Blog of Code</title>
	<atom:link href="https://www.cztcode.com/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.cztcode.com</link>
	<description></description>
	<lastBuildDate>Wed, 24 Jun 2020 08:30:26 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.cztcode.com/wp-content/uploads/2024/02/cropped-logo-32x32.webp</url>
	<title>Java &#8211; Blog of Code</title>
	<link>https://www.cztcode.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">217219486</site>	<item>
		<title>请求转发和重定向</title>
		<link>https://www.cztcode.com/2020/2733/</link>
					<comments>https://www.cztcode.com/2020/2733/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Wed, 24 Jun 2020 08:30:26 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=2733</guid>

					<description><![CDATA[请求转发和重定向]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<h2 class="wp-block-heading">区别</h2>



<p class="is-style-iw-2em">转发是服务器行为，重定向是客户端行为。为什么这样说呢，这就要看两个动作的工作流程：</p>



<p class="is-style-iw-2em">转发过程：客户浏览器发送http请求&#8212;-》web服务器接受此请求&#8211;》调用内部的一个方法在容器内部完成请求处理和转发动作&#8212;-》将目标资源发送给客户；在这里，转发的路径必须是同一个web容器下的url，其不能转向到其他的web路径上去，中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径，也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。</p>



<p class="is-style-iw-2em">重定向过程：客户浏览器发送http请求&#8212;-》web服务器接受后发送302状态码响应及对应新的location给客户浏览器&#8211;》客户浏览器发现是302响应，则自动再发送一个新的http请求，请求url是新的location地址&#8212;-》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL，既然是浏览器重新发出了请求，则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径，客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。</p>



<h4 class="wp-block-heading">重定向，其实是两次request</h4>



<p class="is-style-iw-2em">第一次，客户端request &nbsp; A,服务器响应，并response回来，告诉浏览器，你应该去B。这个时候IE可以看到地址变了，而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中，传输的信息会被丢失。</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="704" src="https://www.cztcode.com/wp-content/uploads/2020/06/2-1024x704.png" alt="" class="wp-image-2735" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/2-1024x704.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/06/2-300x206.png 300w, https://www.cztcode.com/wp-content/uploads/2020/06/2-768x528.png 768w, https://www.cztcode.com/wp-content/uploads/2020/06/2.png 1232w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">举例</h3>



<p class="is-style-iw-2em">重定向格式，等于返回一个新的页面地址</p>



<pre class="wp-block-code"><code>response.sendRedirect("success.jsp"); //重定向，导致数据丢失</code></pre>



<p class="is-style-iw-2em">转发格式，等于服务器内部再发送一个请求</p>



<pre class="wp-block-code"><code>request.getRequestDispatcher("success.jsp").forward(request,response);//请求转发</code></pre>



<h4 class="wp-block-heading">使用重定向格式登录</h4>



<p class="is-style-iw-2em">login.jsp</p>



<figure class="wp-block-image size-large"><img decoding="async" width="580" height="283" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-121.png" alt="" class="wp-image-2737" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-121.png 580w, https://www.cztcode.com/wp-content/uploads/2020/06/image-121-300x146.png 300w" sizes="(max-width: 580px) 100vw, 580px" /></figure>



<p class="is-style-iw-2em">check.jsp</p>



<figure class="wp-block-image size-large"><img decoding="async" width="786" height="215" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-120.png" alt="" class="wp-image-2736" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-120.png 786w, https://www.cztcode.com/wp-content/uploads/2020/06/image-120-300x82.png 300w, https://www.cztcode.com/wp-content/uploads/2020/06/image-120-768x210.png 768w" sizes="(max-width: 786px) 100vw, 786px" /></figure>



<p class="is-style-iw-2em">check.jsp 请求接收login.jsp的数据，告诉login.jsp已经登录成功了，去success.jsp吧。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="522" height="161" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-122.png" alt="" class="wp-image-2738" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-122.png 522w, https://www.cztcode.com/wp-content/uploads/2020/06/image-122-300x93.png 300w" sizes="(max-width: 522px) 100vw, 522px" /><figcaption>success.jsp</figcaption></figure>



<p class="is-style-iw-2em">但是数据并没有传进来，login.jsp把数据给了check.jsp。check.jsp 并没有把数据给到success.jsp，所以我们取不到数据。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="294" height="235" src="https://www.cztcode.com/wp-content/uploads/2020/06/17.gif" alt="" class="wp-image-2739"/></figure>



<h4 class="wp-block-heading">使用请求转发模式</h4>



<p class="is-style-iw-2em">只做一行改动</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="740" height="220" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-123.png" alt="" class="wp-image-2740" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-123.png 740w, https://www.cztcode.com/wp-content/uploads/2020/06/image-123-300x89.png 300w" sizes="(max-width: 740px) 100vw, 740px" /></figure>



<p class="is-style-iw-2em">这次是服务器内部去请求信息。check.jsp没有返回给用户一个新的界面，而是在内部通知success.jsp显示，并将数据传递过去。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="461" height="289" src="https://www.cztcode.com/wp-content/uploads/2020/06/19.gif" alt="" class="wp-image-2745"/></figure>



<p class="is-style-iw-2em"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/2733/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2733</post-id>	</item>
		<item>
		<title>get和post</title>
		<link>https://www.cztcode.com/2020/2711/</link>
					<comments>https://www.cztcode.com/2020/2711/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Wed, 24 Jun 2020 00:06:42 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=2711</guid>

					<description><![CDATA[用户在页面上填写的表单信息都可以通过 GET 和 POST 这两种方法将数据传递到服务器上，当使用 GET 方法时，所有的信息都会出现在 URL 地址中，并且使用 GET 方法最多只能传递 1024 个字符，所以在传输量小或者安全性不那么重要的情况下可以使用 GET 方法。而对于 POST 方法而言，最多可以传输 2MB 字节的数据，而且可以根据需要调节。]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em">摘录来自 ：<a href="https://zhuanlan.zhihu.com/p/29445271" class="rank-math-link" target="_blank" rel="noopener"> 链接</a>   下面有我举的例子讲解。主要写这篇文章是要明确概念。</p>



<p class="is-style-iw-2em">用户在页面上填写的表单信息都可以通过 GET 和 POST 这两种方法将数据传递到服务器上，当使用 GET 方法时，所有的信息都会出现在 URL 地址中，并且使用 GET 方法最多只能传递 1024 个字符，所以在传输量小或者安全性不那么重要的情况下可以使用 GET 方法。而对于 POST 方法而言，最多可以传输 2MB 字节的数据，而且可以根据需要调节。</p>



<p class="is-style-iw-2em">首先，GET和POST都是HTTP协议中的两种发送请求的方法，由于HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP。GET和POST能做的事情是一样一样的。如果给GET加上request body，活着给POST带上url参数，技术上是完全行的通的。也就是说，GET和POST在本质上没什么区别。</p>



<p class="is-style-iw-2em">但是如果真的一点区别都没有，那么这个问题也就不存在了，所以，两者之间最重大的区别就是：</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>GET产生一个TCP数据包；POST产生两个TCP数据包。</strong></p></blockquote>



<p class="is-style-iw-2em">具体点说来就是：</p>



<p class="is-style-iw-2em"><em>对于GET方式的请求，浏览器会把http header和data一并发送出去，服务器响应200（返回数据）；</em></p>



<p class="is-style-iw-2em"><em>而对于POST，浏览器先发送header，服务器响应100 continue，浏览器再发送data，服务器响应200 ok（返回数据）。</em></p>



<p class="is-style-iw-2em">这样看起来，因为POST需要两步，时间上消耗的要多一点，所以GET比POST更有效。那么可不可以用GET替换POST来优化网站性能？</p>



<p class="is-style-iw-2em">1. GET与POST都有自己的语义，不能随便混用。</p>



<p class="is-style-iw-2em">2. 如果网络环境好的话，发一次包的时间和发两次包的时间差别基本可以无视。如果网络环境差的话，两次包的TCP在验证数据包完整性上，有非常大的优点。</p>



<p class="is-style-iw-2em">3. 并不是所有浏览器都会在POST中发送两次包，Firefox就只发送一次。</p>



<ul class="wp-block-list"><li>GET在浏览器回退时是无害的，而POST会再次提交请求。</li><li>GET产生的URL地址可以被Bookmark，而POST不可以。</li><li>GET请求会被浏览器主动cache，而POST不会，除非手动设置。</li><li>GET请求只能进行url编码，而POST支持多种编码方式。</li><li>GET请求参数会被完整保留在浏览器历史记录里，而POST中的参数不会被保留。</li><li>GET请求在URL中传送的参数是有长度限制的，而POST么有。</li><li>对参数的数据类型，GET只接受ASCII字符，而POST没有限制。</li><li>GET比POST更不安全，因为参数直接暴露在URL上，所以不能用来传递敏感信息。</li><li>GET参数通过URL传递，POST放在Request body中。</li></ul>



<h3 class="wp-block-heading">举例</h3>



<h3 class="wp-block-heading">使用get方法</h3>



<p class="is-style-iw-2em">定义两个Jsp文件，登陆界面。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="352" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-103-1024x352.png" alt="" class="wp-image-2712" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-103-1024x352.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/06/image-103-300x103.png 300w, https://www.cztcode.com/wp-content/uploads/2020/06/image-103-768x264.png 768w, https://www.cztcode.com/wp-content/uploads/2020/06/image-103.png 1141w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="719" height="561" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-107.png" alt="" class="wp-image-2716" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-107.png 719w, https://www.cztcode.com/wp-content/uploads/2020/06/image-107-300x234.png 300w" sizes="(max-width: 719px) 100vw, 719px" /></figure>



<p class="is-style-iw-2em">这里form没有定义method，所以默认是get。比如我输入：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="450" height="236" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-105.png" alt="" class="wp-image-2714" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-105.png 450w, https://www.cztcode.com/wp-content/uploads/2020/06/image-105-300x157.png 300w" sizes="(max-width: 450px) 100vw, 450px" /></figure>



<p class="is-style-iw-2em">返回结果，可以看到链接里是有变量名和值的。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-106.png" alt="" class="wp-image-2715"/></figure>



<p class="is-style-iw-2em">不知道你是否有这样的疑问，不是说get方法链接里只能使用ASCⅡ吗，怎么这里面有中文。</p>



<p class="is-style-iw-2em">其实这里的”你好“是显示出的结果，url编码后其实还是ASCⅡ。</p>



<pre class="wp-block-code"><code>http:&#47;&#47;localhost:8080/JspProject/show.jsp?uname=%E4%BD%A0%E5%A5%BD&amp;upwd=&amp;uage=123</code></pre>



<h3 class="wp-block-heading">使用post方法</h3>



<p class="is-style-iw-2em">我们加上method</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="637" height="287" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-108.png" alt="" class="wp-image-2717" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-108.png 637w, https://www.cztcode.com/wp-content/uploads/2020/06/image-108-300x135.png 300w" sizes="(max-width: 637px) 100vw, 637px" /></figure>



<p class="is-style-iw-2em">这次点击注册后变量名称消失</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="583" height="224" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-109.png" alt="" class="wp-image-2718" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-109.png 583w, https://www.cztcode.com/wp-content/uploads/2020/06/image-109-300x115.png 300w" sizes="(max-width: 583px) 100vw, 583px" /></figure>



<h5 class="wp-block-heading">题外话</h5>



<p class="is-style-iw-2em">因为我做过一段CTF，post方法也不是完全安全，这里不是https链接。所以使用BrupSuit可以中途拦截达到欺骗的目的。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/2711/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2711</post-id>	</item>
		<item>
		<title>Tomcat乱码解决</title>
		<link>https://www.cztcode.com/2020/2707/</link>
					<comments>https://www.cztcode.com/2020/2707/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Tue, 23 Jun 2020 14:23:46 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=2707</guid>

					<description><![CDATA[Tomcat乱码解决]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em"><strong>Output乱码解决</strong></p>



<p class="is-style-iw-2em">找到java.util.logging.ConsoleHandler.encoding =&nbsp;UTF-8</p>



<p class="is-style-iw-2em">将其<strong>注释掉</strong></p>



<p class="is-style-iw-2em">#java.util.logging.ConsoleHandler.encoding =&nbsp;UTF-8</p>



<p class="is-style-iw-2em">或者将<strong>UTF-8改为GBK</strong></p>



<p class="is-style-iw-2em">java.util.logging.ConsoleHandler.encoding = GBK</p>



<p class="is-style-iw-2em"><strong>Tomcat Localhost Log 乱码解决</strong></p>



<p class="is-style-iw-2em">找到localhost.org.apache.juli.AsyncFileHandler.encoding =&nbsp;UTF-8</p>



<p class="is-style-iw-2em">将其<strong>注释掉</strong></p>



<p class="is-style-iw-2em">#localhost.org.apache.juli.AsyncFileHandler.encoding =&nbsp;UTF-8</p>



<p class="is-style-iw-2em">或者将<strong>UTF-8改为GBK</strong></p>



<p class="is-style-iw-2em">localhost.org.apache.juli.AsyncFileHandler.encoding&nbsp;= GBK</p>



<p class="is-style-iw-2em"><strong>Tomcat Catania Log 乱码解决</strong></p>



<p class="is-style-iw-2em">找到catalina.org.apache.juli.AsyncFileHandler.encoding =&nbsp;UTF-8</p>



<p class="is-style-iw-2em">将其<strong>注释掉</strong></p>



<p class="is-style-iw-2em">#catalina.org.apache.juli.AsyncFileHandler.encoding =&nbsp;UTF-8</p>



<p class="is-style-iw-2em">或者将<strong>UTF-8改为GBK</strong></p>



<p class="is-style-iw-2em">catalina.org.apache.juli.AsyncFileHandler.encoding = GBK</p>



<h4 class="wp-block-heading">页面乱码</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="792" height="443" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-102.png" alt="" class="wp-image-2709" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-102.png 792w, https://www.cztcode.com/wp-content/uploads/2020/06/image-102-300x168.png 300w, https://www.cztcode.com/wp-content/uploads/2020/06/image-102-768x430.png 768w" sizes="(max-width: 792px) 100vw, 792px" /></figure>



<p class="is-style-iw-2em">-Dfile.encoding=UTF-8</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/2707/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2707</post-id>	</item>
		<item>
		<title>Jsp基础</title>
		<link>https://www.cztcode.com/2020/2683/</link>
					<comments>https://www.cztcode.com/2020/2683/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Tue, 23 Jun 2020 05:54:06 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=2683</guid>

					<description><![CDATA[JSP全称Java Server Pages，是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em">JSP全称Java Server Pages，是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以&lt;%开头以%&gt;结束。</p>



<p class="is-style-iw-2em"><a href="https://www.runoob.com/jsp/jsp-tutorial.html" class="rank-math-link" target="_blank" rel="noopener">详细介绍</a></p>



<h3 class="wp-block-heading">JSP 处理</h3>



<p class="is-style-iw-2em">以下步骤表明了 Web 服务器是如何使用JSP来创建网页的：</p>



<ul class="wp-block-list"><li>就像其他普通的网页一样，您的浏览器发送一个 HTTP 请求给服务器。</li><li>Web 服务器识别出这是一个对 JSP 网页的请求，并且将该请求传递给 JSP 引擎。通过使用 URL或者 .jsp 文件来完成。</li><li>JSP 引擎从磁盘中载入 JSP 文件，然后将它们转化为 Servlet。这种转化只是简单地将所有模板文本改用 println() 语句，并且将所有的 JSP 元素转化成 Java 代码。</li><li>JSP 引擎将 Servlet 编译成可执行类，并且将原始请求传递给 Servlet 引擎。</li><li>Web 服务器的某组件将会调用 Servlet 引擎，然后载入并执行 Servlet 类。在执行过程中，Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。</li><li>Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中。</li><li>最终，Web 浏览器处理 HTTP response 中动态产生的HTML网页，就好像在处理静态网页一样。</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="468" height="241" src="https://www.cztcode.com/wp-content/uploads/2020/06/3.jpg" alt="" class="wp-image-2684" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/3.jpg 468w, https://www.cztcode.com/wp-content/uploads/2020/06/3-300x154.jpg 300w" sizes="(max-width: 468px) 100vw, 468px" /></figure>



<p class="is-style-iw-2em">一般情况下，JSP 引擎会检查 JSP 文件对应的 Servlet 是否已经存在，并且检查 JSP 文件的修改日期是否早于 Servlet。如果 JSP 文件的修改日期早于对应的 Servlet，那么容器就可以确定 JSP 文件没有被修改过并且 Servlet 有效。这使得整个流程与其他脚本语言（比如 PHP）相比要高效快捷一些。</p>



<p class="is-style-iw-2em">总的来说，JSP 网页就是用另一种方式来编写 Servlet 而不用成为 Java 编程高手。除了解释阶段外，JSP 网页几乎可以被当成一个普通的 Servlet 来对待。</p>



<h3 class="wp-block-heading">Jsp语法</h3>



<p class="is-style-iw-2em">由于Jsp将语句转化为Java代码，Java代码又被转化为HTML语言，所以输出换行时使用&lt;/br>。更改Jsp文件后直接刷新浏览器页面即可看到更新，因为当Jsp文件更改后，Jsp文件时间戳晚于Servlet（Java代码）。所以要重新编译生成。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="516" height="298" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-94.png" alt="" class="wp-image-2685" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-94.png 516w, https://www.cztcode.com/wp-content/uploads/2020/06/image-94-300x173.png 300w" sizes="(max-width: 516px) 100vw, 516px" /></figure>



<pre class="wp-block-code"><code>&lt;%!
   全局变量、定义方法
%>
&lt;%
   局部变量、java语句
%>

&lt;%=输出表达式 %></code></pre>



<p class="is-style-iw-2em">输出</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1012" height="233" src="https://www.cztcode.com/wp-content/uploads/2020/06/image-95.png" alt="" class="wp-image-2687" srcset="https://www.cztcode.com/wp-content/uploads/2020/06/image-95.png 1012w, https://www.cztcode.com/wp-content/uploads/2020/06/image-95-300x69.png 300w, https://www.cztcode.com/wp-content/uploads/2020/06/image-95-768x177.png 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></figure>



<h3 class="wp-block-heading">JSP隐含对象</h3>



<p class="is-style-iw-2em">不需要创建对象可以直接使用。</p>



<p class="is-style-iw-2em">JSP支持九个自动定义的变量，江湖人称隐含对象。这九个隐含对象的简介见下表：</p>



<figure class="wp-block-table"><table><tbody><tr><th><strong>对象</strong></th><th><strong>描述</strong></th></tr><tr><td>request</td><td><strong>HttpServletRequest</strong>类的实例</td></tr><tr><td>response</td><td><strong>HttpServletResponse</strong>类的实例</td></tr><tr><td>out</td><td><strong>PrintWriter</strong>类的实例，用于把结果输出至网页上</td></tr><tr><td>session</td><td><strong>HttpSession</strong>类的实例</td></tr><tr><td>application</td><td><strong>ServletContext</strong>类的实例，与应用上下文有关</td></tr><tr><td>config</td><td><strong>ServletConfig</strong>类的实例</td></tr><tr><td>pageContext</td><td><strong>PageContext</strong>类的实例，提供对JSP页面所有对象以及命名空间的访问</td></tr><tr><td>page</td><td>类似于Java类中的this关键字</td></tr><tr><td>Exception</td><td><strong>Exception</strong>类的对象，代表发生错误的JSP页面中对应的异常对象</td></tr></tbody></table></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/2683/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2683</post-id>	</item>
		<item>
		<title>JAVA使用JDBC(下)</title>
		<link>https://www.cztcode.com/2020/2297/</link>
					<comments>https://www.cztcode.com/2020/2297/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Sat, 23 May 2020 15:55:54 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=2297</guid>

					<description><![CDATA[JDBC工具类搭建]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em"><strong><strong>JDBC工具类搭建</strong></strong></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="464" height="573" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-129.png" alt="" class="wp-image-2310" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-129.png 464w, https://www.cztcode.com/wp-content/uploads/2020/05/image-129-243x300.png 243w" sizes="(max-width: 464px) 100vw, 464px" /></figure>



<h4 class="wp-block-heading">使用Log4j记录JDBC的日志信息 </h4>



<p class="is-style-iw-2em">会安装会用就可，不必纠结怎么实现的，<a href="https://static.cztcode.com/log4j-1.2.15.jar" class="rank-math-link" target="_blank" rel="noopener">点击下载Log4j.jar</a></p>



<p class="is-style-iw-2em">首先将Log4j添加依赖</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="449" height="158" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-120.png" alt="" class="wp-image-2298" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-120.png 449w, https://www.cztcode.com/wp-content/uploads/2020/05/image-120-300x106.png 300w" sizes="(max-width: 449px) 100vw, 449px" /></figure>



<p class="is-style-iw-2em">在src目录下创建文件，.properties是一种主要在Java相关技术中用来存储应用程序的可配置参数的文件的文件扩展名。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="444" height="255" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-121.png" alt="" class="wp-image-2299" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-121.png 444w, https://www.cztcode.com/wp-content/uploads/2020/05/image-121-300x172.png 300w" sizes="(max-width: 444px) 100vw, 444px" /></figure>



<p class="is-style-iw-2em">添加如下代码，用于生成日志的格式</p>



<pre class="wp-block-code"><code># DEBUG\u8BBE\u7F6E\u8F93\u51FA\u65E5\u5FD7\u7EA7\u522B\uFF0C\u7531\u4E8E\u4E3ADEBUG\uFF0C\u6240\u4EE5ERROR\u3001WARN\u548CINFO \u7EA7\u522B\u65E5\u5FD7\u4FE1\u606F\u4E5F\u4F1A\u663E\u793A\u51FA\u6765
log4j.rootLogger=DEBUG,Console,RollingFile

#\u5C06\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230\u63A7\u5236\u53F0
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern= &#91;%-5p]-&#91;%d{yyyy-MM-dd HH:mm:ss}] -%l -%m%n
#\u5C06\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230\u64CD\u4F5C\u7CFB\u7EDFD\u76D8\u6839\u76EE\u5F55\u4E0B\u7684log.log\u6587\u4EF6\u4E2D
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=D://log.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d &#91;%t] %-5p %-40.40c %X{traceId}-%m%n
</code></pre>



<p class="is-style-iw-2em">添加基本配置，注意导入的包名，是使用Log4j中的 logger</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="880" height="215" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-122.png" alt="" class="wp-image-2300" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-122.png 880w, https://www.cztcode.com/wp-content/uploads/2020/05/image-122-300x73.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-122-768x188.png 768w" sizes="(max-width: 880px) 100vw, 880px" /></figure>



<p class="is-style-iw-2em">在catch中添加这句输出bug信息，和安卓的LogCat用法很像</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="856" height="164" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-124.png" alt="" class="wp-image-2302" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-124.png 856w, https://www.cztcode.com/wp-content/uploads/2020/05/image-124-300x57.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-124-768x147.png 768w" sizes="(max-width: 856px) 100vw, 856px" /></figure>



<p class="is-style-iw-2em">展示bug的方式也一模一样，栈跟踪日志。我没开数据库所以没连接上。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="460" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-125-1024x460.png" alt="" class="wp-image-2303" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-125-1024x460.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/05/image-125-300x135.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-125-768x345.png 768w, https://www.cztcode.com/wp-content/uploads/2020/05/image-125-1536x691.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/05/image-125.png 1726w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">完善JDBC的调用</h4>



<p class="is-style-iw-2em">我们之前是在JDBC类中连接数据库，在connection中定义了连接数据库的信息</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="936" height="399" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-126.png" alt="" class="wp-image-2304" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-126.png 936w, https://www.cztcode.com/wp-content/uploads/2020/05/image-126-300x128.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-126-768x327.png 768w" sizes="(max-width: 936px) 100vw, 936px" /></figure>



<p class="is-style-iw-2em">创建dp.properties文件，存储数据库连接信息，我创建了一个dp.properties文件，里面记录：</p>



<pre class="wp-block-code"><code>dp.username=root
dp.password=1qazxsw2
dp.url=jdbc:mysql://127.0.0.1:3306/test</code></pre>



<p class="is-style-iw-2em">这里注意，如果是使用intellij的话，需要建立一个根文件夹，并标记为资源文件，否则无法读取。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="795" height="706" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-127.png" alt="" class="wp-image-2308" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-127.png 795w, https://www.cztcode.com/wp-content/uploads/2020/05/image-127-300x266.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-127-768x682.png 768w" sizes="(max-width: 795px) 100vw, 795px" /></figure>



<p class="is-style-iw-2em">然后再创建一个propertiesTool.java文件</p>



<pre class="wp-block-code"><code>package tools.db;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class propertiesTool {
    private static Properties properties = new Properties();
    static {
        InputStream inputStream = propertiesTool.class.getClassLoader().getResourceAsStream("db.properties");//将db.properties变为javaIO流对象
        try {
            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}</code></pre>



<p class="is-style-iw-2em">这样就可以读取到dp.properties里面的信息了</p>



<p class="is-style-iw-2em">调用</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="634" height="225" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-130.png" alt="" class="wp-image-2311" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-130.png 634w, https://www.cztcode.com/wp-content/uploads/2020/05/image-130-300x106.png 300w" sizes="(max-width: 634px) 100vw, 634px" /></figure>



<p class="is-style-iw-2em">返回值</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="528" height="74" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-131.png" alt="" class="wp-image-2312" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-131.png 528w, https://www.cztcode.com/wp-content/uploads/2020/05/image-131-300x42.png 300w" sizes="(max-width: 528px) 100vw, 528px" /></figure>



<p class="is-style-iw-2em">没有报错，实现成功</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/2297/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2297</post-id>	</item>
		<item>
		<title>SQL注入</title>
		<link>https://www.cztcode.com/2020/2276/</link>
					<comments>https://www.cztcode.com/2020/2276/#comments</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Fri, 22 May 2020 12:40:02 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=2276</guid>

					<description><![CDATA[以为是CTF的内容，没想到Java也讲了。sql注入通过输入特殊的字符，达到一些特殊目的。]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em">以为是CTF的内容，没想到Java也讲了。sql注入通过输入特殊的字符，达到一些特殊目的。</p>



<p>执行语句</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="653" height="159" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-111.png" alt="" class="wp-image-2277" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-111.png 653w, https://www.cztcode.com/wp-content/uploads/2020/05/image-111-300x73.png 300w" sizes="(max-width: 653px) 100vw, 653px" /></figure>



<p>实际执行的sql语句</p>



<pre class="wp-block-code"><code>delete from student where id='1' or '1'='1'</code></pre>



<p>等于删除了数据库的所有内容，因为 or后面的语句恒为true</p>



<h3 class="wp-block-heading">如何防止SQL注入</h3>



<p class="is-style-iw-2em">使用PreparedStatement拼接语句</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="992" height="277" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-112.png" alt="" class="wp-image-2278" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-112.png 992w, https://www.cztcode.com/wp-content/uploads/2020/05/image-112-300x84.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-112-768x214.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></figure>



<p class="is-style-iw-2em">这样就可以避免注入了，在测试之前，先封装一下这个方法，使用动态变量可以添加多个数值。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="389" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-114-1024x389.png" alt="" class="wp-image-2280" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-114-1024x389.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/05/image-114-300x114.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-114-768x292.png 768w, https://www.cztcode.com/wp-content/uploads/2020/05/image-114.png 1048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="is-style-iw-2em">主方法中添加之前的注入语句</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="603" height="148" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-115.png" alt="" class="wp-image-2281" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-115.png 603w, https://www.cztcode.com/wp-content/uploads/2020/05/image-115-300x74.png 300w" sizes="(max-width: 603px) 100vw, 603px" /></figure>



<p class="is-style-iw-2em">若执行成功了任何一行，返回true</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="529" height="119" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-116.png" alt="" class="wp-image-2282" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-116.png 529w, https://www.cztcode.com/wp-content/uploads/2020/05/image-116-300x67.png 300w" sizes="(max-width: 529px) 100vw, 529px" /></figure>



<p class="is-style-iw-2em">看来这样就可以避免注入了</p>



<p class="is-style-iw-2em">更新了之前JDBC类中的select和update方法，使用prepareStatement方法</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="853" height="415" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-117.png" alt="" class="wp-image-2287" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-117.png 853w, https://www.cztcode.com/wp-content/uploads/2020/05/image-117-300x146.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-117-768x374.png 768w" sizes="(max-width: 853px) 100vw, 853px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="881" height="425" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-118.png" alt="" class="wp-image-2288" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-118.png 881w, https://www.cztcode.com/wp-content/uploads/2020/05/image-118-300x145.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-118-768x370.png 768w" sizes="(max-width: 881px) 100vw, 881px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/2276/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2276</post-id>	</item>
		<item>
		<title>Java使用JDBC（中）</title>
		<link>https://www.cztcode.com/2020/2126/</link>
					<comments>https://www.cztcode.com/2020/2126/#comments</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Sun, 17 May 2020 08:51:02 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=2126</guid>

					<description><![CDATA[上一节创建了一个SelectSql方法，实现了查询。但如果想实现自定义的查询，需要重写自定义JDBC类中的SelectSql方法，首先我们想这样写：]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em">上一节创建了一个SelectSql方法，实现了查询。但如果想实现自定义的查询，需要重写自定义JDBC类中的SelectSql方法，首先我们想这样写：</p>



<pre class="wp-block-code"><code>ResultSet SelectSql(String sql){
        Connection connection=null;
        Statement search=null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/test";
            connection = DriverManager.getConnection(url, "root", "1qazxsw2");
            search=connection.createStatement();
            rs = search.executeQuery(sql);
            return rs;
        } catch (Exception throwables) {
            throwables.printStackTrace();
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(search!=null){
                try {
                    search.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }</code></pre>



<p class="is-style-iw-2em">这个方法返回Result方法，看似没有问题，但实际运行时会报错，因为在执行时，rs已经被关闭了。</p>



<h3 class="wp-block-heading">使用接口实现</h3>



<p class="is-style-iw-2em">定义一个名为IRowMapper的接口</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="594" height="289" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-54.png" alt="" class="wp-image-2128" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-54.png 594w, https://www.cztcode.com/wp-content/uploads/2020/05/image-54-300x146.png 300w" sizes="(max-width: 594px) 100vw, 594px" /></figure>



<p class="is-style-iw-2em">在SelectSql中，通过调用接口里的方法实现查询。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="341" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-55.png" alt="" class="wp-image-2129" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-55.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/05/image-55-300x100.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-55-768x256.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="is-style-iw-2em">在主方法里写出一个实现接口的类</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="857" height="342" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-56.png" alt="" class="wp-image-2130" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-56.png 857w, https://www.cztcode.com/wp-content/uploads/2020/05/image-56-300x120.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-56-768x306.png 768w" sizes="(max-width: 857px) 100vw, 857px" /></figure>



<p class="is-style-iw-2em">之后我们就可以传递接口实例，去实现Select了</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="564" height="150" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-57.png" alt="" class="wp-image-2131" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-57.png 564w, https://www.cztcode.com/wp-content/uploads/2020/05/image-57-300x80.png 300w" sizes="(max-width: 564px) 100vw, 564px" /></figure>



<p class="is-style-iw-2em">执行结果</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="620" height="180" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-58.png" alt="" class="wp-image-2132" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-58.png 620w, https://www.cztcode.com/wp-content/uploads/2020/05/image-58-300x87.png 300w" sizes="(max-width: 620px) 100vw, 620px" /></figure>



<p class="is-style-iw-2em"><strong>这样就解决了自定义查询的问题！</strong>每次把自定义查询的内容写在接口的实例里就好。</p>



<h3 class="wp-block-heading">改进</h3>



<p class="is-style-iw-2em">把资源释放写成方法，实现代码复用</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="896" height="448" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-59.png" alt="" class="wp-image-2134" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-59.png 896w, https://www.cztcode.com/wp-content/uploads/2020/05/image-59-300x150.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-59-768x384.png 768w" sizes="(max-width: 896px) 100vw, 896px" /></figure>



<p class="is-style-iw-2em">为select重载一个close（select里有一个ResultSet）</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="634" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-65-1024x634.png" alt="" class="wp-image-2140" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-65-1024x634.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/05/image-65-300x186.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-65-768x476.png 768w, https://www.cztcode.com/wp-content/uploads/2020/05/image-65.png 1051w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="is-style-iw-2em">调用此方法关闭Statment和connection，ResultSet</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="817" height="375" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-66.png" alt="" class="wp-image-2141" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-66.png 817w, https://www.cztcode.com/wp-content/uploads/2020/05/image-66-300x138.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-66-768x353.png 768w" sizes="(max-width: 817px) 100vw, 817px" /></figure>



<p class="is-style-iw-2em"><strong>继续优化</strong></p>



<p class="is-style-iw-2em">可以看到这四行在查询和更新方法中是重复使用的</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="958" height="427" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-62.png" alt="" class="wp-image-2137" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-62.png 958w, https://www.cztcode.com/wp-content/uploads/2020/05/image-62-300x134.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-62-768x342.png 768w" sizes="(max-width: 958px) 100vw, 958px" /></figure>



<p class="is-style-iw-2em">创建方法返回connection对象</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="940" height="373" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-63.png" alt="" class="wp-image-2138" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-63.png 940w, https://www.cztcode.com/wp-content/uploads/2020/05/image-63-300x119.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-63-768x305.png 768w" sizes="(max-width: 940px) 100vw, 940px" /></figure>



<p class="is-style-iw-2em">在每次连接数据库时，调用此方法即可</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="607" height="281" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-64.png" alt="" class="wp-image-2139" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-64.png 607w, https://www.cztcode.com/wp-content/uploads/2020/05/image-64-300x139.png 300w" sizes="(max-width: 607px) 100vw, 607px" /></figure>



<h3 class="wp-block-heading">exist方法</h3>



<p class="is-style-iw-2em">写一个exist方法，便于查询数据库中是否已经存入某个数据</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="648" height="451" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-67.png" alt="" class="wp-image-2142" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-67.png 648w, https://www.cztcode.com/wp-content/uploads/2020/05/image-67-300x209.png 300w" sizes="(max-width: 648px) 100vw, 648px" /></figure>



<p class="is-style-iw-2em">查询失败</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-68-1024x387.png" alt="" class="wp-image-2143"/></figure>



<p class="is-style-iw-2em">查询成功</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="370" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-69-1024x370.png" alt="" class="wp-image-2144" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-69-1024x370.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/05/image-69-300x108.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-69-768x277.png 768w, https://www.cztcode.com/wp-content/uploads/2020/05/image-69.png 1535w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">学生管理系统</h3>



<p class="is-style-iw-2em">用以上的知识就可以简单的创建一个学生管理系统，实现方法已经讲解了，这里直接放代码，有兴趣的可以看看</p>



<pre class="wp-block-code"><code>package com.cztcode.student;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

import Test.IRowMapper;
import Test.JDBC;

public class main {

    public static void main(String&#91;] args) {
        System.out.println("*********************************");
        System.out.println("*\t\t\t\t*");
        System.out.println("*\t欢迎使用学生信息管理系统\t*");
        System.out.println("*\t\t\t\t*");
        System.out.println("*********************************");
        while (true) {
            menu();
        }
    }


    static void menu() {
        System.out.println("1、添加学生信息");
        System.out.println("2、删除学生信息");
        System.out.println("3、修改学生信息");
        System.out.println("4、查询学生信息");
        System.out.println("请输入操作，以Enter键结束:");
        Scanner in;
        in = new Scanner(System.in);
        String id, name, sex, address,sql;
        int option = in.nextInt();
        switch (option) {
            case 1:
                System.out.println("输入学生信息: id 姓名 性别 地址 ");
                id = in.next();
                if (check(id)) {
                    System.out.println("已经添加过,重新选择");
                    break;
                }
                name = in.next();
                sex = in.next();
                address = in.next();
                sql = "insert into student (id,name,sex,address)values('"+id+"','"+name+"','"+sex+"','"+address+"')";
                JDBC.UpdateSql(sql);
                break;
            case 2:
                System.out.println("请输入id");
                id=in.next();
                if (!check(id)) {
                    System.out.println("没有此学生");
                    break;
                }
                sql="delete  from student where id='"+id+"'";
                JDBC.UpdateSql(sql);
                System.out.println("已删除");
                break;
            case 3:
                System.out.println("请输入id");
                id=in.next();
                if (!check(id)) {
                    System.out.println("没有此学生");
                    break;
                }
                name = in.next();
                sex = in.next();
                address = in.next();
                sql = "insert into student (id,name,sex,address)values('"+id+"','"+name+"','"+sex+"','"+address+"')";
                JDBC.UpdateSql(sql);
                System.out.println("修改成功");
                break;
            case 4:
                System.out.println("请输入id");
                id=in.next();
                if (!check(id)) {
                    System.out.println("没有此学生");
                    break;
                }
                sql="select * from student where id='"+id+"'";
                JDBC.SelectSql(sql,new RowMapper());
                System.out.println("查询完毕");
                break;
            default:
                System.out.println("I'm Sorry,there is not the " + option + " option,please try again.");
        }
    }

    static boolean check(String id) {
        String sql = "select * from student where id='"+id+"'";
        return JDBC.exist(sql);
    }
}
class RowMapper implements IRowMapper {
    public void rowMapper(ResultSet rs) {
        try {
            while (rs.next()) {
                System.out.print(rs.getString("id") + " ");
                System.out.print(rs.getString("name") + " ");
                System.out.print(rs.getString("sex") + " ");
                System.out.println(rs.getString("address"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}</code></pre>



<p class="is-style-iw-2em"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/2126/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2126</post-id>	</item>
		<item>
		<title>Java使用JDBC（上）</title>
		<link>https://www.cztcode.com/2020/2054/</link>
					<comments>https://www.cztcode.com/2020/2054/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Fri, 15 May 2020 14:26:13 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=2054</guid>

					<description><![CDATA[大家都知道JDBC是面向关系型数据库的，全称Java Database Connectivity。可是Java怎么能使用JDBC呢，小编也很好奇，但事实就是这样，大家有什么想法在留言区评论吧！（狗头保命）????]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em">大家都知道JDBC是面向关系型数据库的，全称Java Database Connectivity。可是Java怎么能使用JDBC呢，小编也很好奇，但事实就是这样，大家有什么想法在留言区评论吧！（狗头保命）????</p>



<h3 class="wp-block-heading">创建数据库</h3>



<p class="is-style-iw-2em">首先使用Navicat Premium 15 创建一个表，先存进去一点数据方便一会调用。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="903" height="96" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-29.png" alt="" class="wp-image-2055" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-29.png 903w, https://www.cztcode.com/wp-content/uploads/2020/05/image-29-300x32.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-29-768x82.png 768w" sizes="(max-width: 903px) 100vw, 903px" /></figure>



<p class="is-style-iw-2em">运行两个查询语句</p>



<pre class="wp-block-code"><code>insert into user_info (id,name) VALUES ('123','陈泽曈')
insert into user_info (id,name) VALUES ('456','老高')</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="703" height="286" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-30.png" alt="" class="wp-image-2056" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-30.png 703w, https://www.cztcode.com/wp-content/uploads/2020/05/image-30-300x122.png 300w" sizes="(max-width: 703px) 100vw, 703px" /></figure>



<p class="is-style-iw-2em">可以看到已经添加进来了。</p>



<h3 class="wp-block-heading">添加依赖</h3>



<p class="is-style-iw-2em">添加<a href="https://static.cztcode.com/mysql-connector-java-5.1.44-bin.jar" class="rank-math-link" target="_blank" rel="noopener">mysql-connector-java-5.1.44-bin.jar</a>包</p>



<p class="is-style-iw-2em">选择添加到lib文件夹下</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="682" height="246" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-31.png" alt="" class="wp-image-2057" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-31.png 682w, https://www.cztcode.com/wp-content/uploads/2020/05/image-31-300x108.png 300w" sizes="(max-width: 682px) 100vw, 682px" /></figure>



<p class="is-style-iw-2em">可以去  文件&#8211;项目结构中选择添加依赖</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-32.png" alt="" class="wp-image-2058"/></figure>



<p class="is-style-iw-2em">也可以右键添加为库</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-33.png" alt="" class="wp-image-2059" width="327" height="506" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-33.png 436w, https://www.cztcode.com/wp-content/uploads/2020/05/image-33-194x300.png 194w" sizes="(max-width: 327px) 100vw, 327px" /></figure>



<h3 class="wp-block-heading">连接数据库</h3>



<p class="is-style-iw-2em">使用JDBC应用程序向表中查询数据记录需要以下步骤：</p>



<ul class="wp-block-list"><li><strong>导入包</strong>：需要包含包含数据库编程所需的JDBC类的包。 大多数情况下，使用<code>import java.sql.*</code>就足够了。</li><li><strong>注册JDBC驱动程序</strong>：需要初始化驱动程序，以便可以程序中打开数据库的通信通道。</li><li><strong>打开连接</strong>：需要使用<code>DriverManager.getConnection()</code>方法来创建一个<code>Connection</code>对象，它表示与数据库服务器的物理连接。</li><li><strong>执行查询</strong>：需要使用类型为<code>Statement</code>的对象来构建和提交SQL语句，以在选择的数据库的表中查询数据记录。</li><li><strong>提取数据</strong>：执行SQL查询后，可以从表中获取记录。</li><li><strong>释放资源</strong>：关闭Statement和connection</li></ul>



<h3 class="wp-block-heading">数据库的查询</h3>



<pre class="wp-block-code"><code>package Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Test {
    public static void main(String&#91;] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql://127.0.0.1:3306/test";
            Connection connection= DriverManager.getConnection(url,"root","1qazxsw2");
            System.out.println("连接成功!");
            Statement search=connection.createStatement();
            String sql="SELECT * FROM user_info";
            ResultSet rs = search.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString("id"));
                System.out.println(rs.getString("name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
</code></pre>



<p class="is-style-iw-2em">注意导入sql包，这里捕获异常直接用通用的Exception，不然要使用两个try/catch捕获异常。一个为forName，一个为getConnection抛出。</p>



<ul class="wp-block-list"><li>Statement  用于执行静态SQL语句并返回其生成的结果的对象</li><li>ResultSet 对象保持一个光标指向其当前的数据行</li></ul>



<p class="is-style-iw-2em">输出为：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="675" height="295" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-34.png" alt="" class="wp-image-2060" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-34.png 675w, https://www.cztcode.com/wp-content/uploads/2020/05/image-34-300x131.png 300w" sizes="(max-width: 675px) 100vw, 675px" /></figure>



<h3 class="wp-block-heading">数据库的修改</h3>



<p class="is-style-iw-2em"><strong>几个操作语法很相似，就直接给出例子了。</strong></p>



<pre class="wp-block-preformatted"><strong>executeUpdate</strong>:执行给定的SQL语句，这可能是INSERT ， UPDATE ，或DELETE语句，或者不返回任何内容，如SQL DDL语句的SQL语句。</pre>



<h4 class="wp-block-heading">删除数据</h4>



<p class="is-style-iw-2em">先插入一个id=0的数据</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="204" height="159" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-36.png" alt="" class="wp-image-2071"/></figure>



<pre class="wp-block-code"><code> int result = search.executeUpdate("delete from user_info where id=0");
            if(result >0){
                System.out.println("ok");
            }</code></pre>



<p class="is-style-iw-2em">使用这句话删除id为0的数据行</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="223" height="176" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-37.png" alt="" class="wp-image-2072"/></figure>



<p class="is-style-iw-2em">出现了OK，数据库中也删除成功。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="222" height="200" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-38.png" alt="" class="wp-image-2073"/></figure>



<h4 class="wp-block-heading">添加数据</h4>



<pre class="wp-block-code"><code>int result1 = search.executeUpdate("insert into user_info (id,name)values('789','hello')");
            if (result1 > 0) {
                System.out.println("添加成功");
            }</code></pre>



<p class="is-style-iw-2em">执行结果</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="344" height="178" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-39.png" alt="" class="wp-image-2075" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-39.png 344w, https://www.cztcode.com/wp-content/uploads/2020/05/image-39-300x155.png 300w" sizes="(max-width: 344px) 100vw, 344px" /></figure>



<h4 class="wp-block-heading">更新数据</h4>



<p class="is-style-iw-2em">这次把数据库连接语句做了封装，写进了一个类。使用时传递语句就好。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="741" height="179" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-42.png" alt="" class="wp-image-2079" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-42.png 741w, https://www.cztcode.com/wp-content/uploads/2020/05/image-42-300x72.png 300w" sizes="(max-width: 741px) 100vw, 741px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="386" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-41-1024x386.png" alt="" class="wp-image-2078" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-41-1024x386.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/05/image-41-300x113.png 300w, https://www.cztcode.com/wp-content/uploads/2020/05/image-41-768x289.png 768w, https://www.cztcode.com/wp-content/uploads/2020/05/image-41.png 1049w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="is-style-iw-2em">JDBC类</p>



<pre class="wp-block-code"><code>package Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBC {
    boolean UpdateSql(String sql){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/test";
            Connection connection = DriverManager.getConnection(url, "root", "1qazxsw2");
            Statement exe=connection.createStatement();
            int result=exe.executeUpdate(sql);
            return result>0;
        } catch (Exception e) {
            e.printStackTrace();
        }
    return  false;
    }
}
</code></pre>



<h3 class="wp-block-heading">释放资源</h3>



<p class="is-style-iw-2em">使用完Statement和connection后，要进行资源的释放，那么问题来了，应该怎样设置释放的逻辑呢。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="761" height="449" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-43.png" alt="" class="wp-image-2080" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-43.png 761w, https://www.cztcode.com/wp-content/uploads/2020/05/image-43-300x177.png 300w" sizes="(max-width: 761px) 100vw, 761px" /></figure>



<p class="is-style-iw-2em">如果将close添加到这里，当sql语句出错时，会跳转到catch语句，无法释放。所以要添加到finally里。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="684" height="583" src="https://www.cztcode.com/wp-content/uploads/2020/05/image-45.png" alt="" class="wp-image-2082" srcset="https://www.cztcode.com/wp-content/uploads/2020/05/image-45.png 684w, https://www.cztcode.com/wp-content/uploads/2020/05/image-45-300x256.png 300w" sizes="(max-width: 684px) 100vw, 684px" /></figure>



<p class="is-style-iw-2em">当exe或者connection中为null时，不用关闭，因为本来就没有创建成功，当为null时关闭。注意不能写到一个if中一起关闭，因为有可能statement创建失败，而在一个if中时则无法关闭connection。</p>



<p class="is-style-iw-2em">注：查询也可以封装到方法里</p>



<pre class="wp-block-code"><code>boolean SelectSql(String sql){
        Connection connection=null;
        Statement search=null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/test";
            connection = DriverManager.getConnection(url, "root", "1qazxsw2");
            search=connection.createStatement();
            rs = search.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString("id"));
                System.out.println(rs.getString("name"));
            }
        } catch (Exception throwables) {
            throwables.printStackTrace();
            if(rs!=null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(search!=null){
                try {
                    search.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
</code></pre>



<p class="is-style-iw-2em"><a href="https://www.cztcode.com/2020/java-using-jdbc-middle/" class="rank-math-link">Java使用JDBC（中）</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/2054/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2054</post-id>	</item>
		<item>
		<title>Java中的代码块</title>
		<link>https://www.cztcode.com/2020/1980/</link>
					<comments>https://www.cztcode.com/2020/1980/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Sat, 09 May 2020 14:18:41 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=1980</guid>

					<description><![CDATA[Java中有普通代码块，静态代码块，构造代码块，它们的执行顺序是怎样的呢？ 普通代码块： 在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定&#8211;“先出现先执行” 构造代码块： 直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用，每次创建对象都会被调用，并且构造代码块的执行次序优先于类构造函数。 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em">Java中有普通代码块，静态代码块，构造代码块，它们的执行顺序是怎样的呢？</p>



<h2 class="wp-block-heading">普通代码块：</h2>



<p class="is-style-iw-2em">在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定&#8211;“先出现先执行”</p>



<p class="is-style-iw-2em">构造代码块：</p>



<p class="is-style-iw-2em">直接在类中定义且没有加static关键字的代码块称为{}构造代码块。<br><strong>构造代码块</strong>在创建对象时被调用，<strong>每次创建对象都会被调用</strong>，并且<strong>构造代码块的执行次序优先于类构造函数</strong>。</p>



<h2 class="wp-block-heading">静态代码块:</h2>



<p class="is-style-iw-2em">在java中使用static关键字声明的代码块。静态块用于初始化类，为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块，所以静态代码块先于主方法执行。如果类中包含多个静态代码块，那么将按照&#8221;先定义的代码先执行，后定义的代码后执行&#8221;。</p>



<h3 class="wp-block-heading">注意：</h3>



<ul class="wp-block-list"><li> 静态代码块不能直接访问静态实例变量和实例方法，需要通过类的实例对象来访问。</li><li> 静态代码块不能存在于任何方法体内。</li></ul>



<h2 class="wp-block-heading">执行顺序</h2>



<p class="is-style-iw-2em">比如下面这个程序</p>



<pre class="wp-block-code"><code>package Test;

public class Test {
    public Test(){//构造函数
        System.out.println("构造函数");
    }

    {//构造代码块,在类中
        System.out.println("构造代码块");
    }
    void a(){
        {//方法中,普通代码块
            System.out.println("普通代码块");
        }
    }
    static {//静态代码块
        System.out.println("静态代码块");
    }
    public static void main(String&#91;] args) {
        new Test().a();
    }
}
</code></pre>



<h3 class="wp-block-heading">执行结果为：</h3>



<ul class="wp-block-list"><li>静态代码块</li><li>构造代码块</li><li>构造函数</li><li>普通代码块</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/1980/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1980</post-id>	</item>
		<item>
		<title>HashSet学生管理系统</title>
		<link>https://www.cztcode.com/2020/1950/</link>
					<comments>https://www.cztcode.com/2020/1950/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Fri, 08 May 2020 13:03:01 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=1950</guid>

					<description><![CDATA[使用HashSet试验建立学生管理系统]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em">使用HashSet试验建立学生管理系统。</p>



<p class="is-style-iw-2em">主程序</p>



<pre class="wp-block-code"><code>package com.cztcode.student;

import java.util.HashSet;
import java.util.Scanner;

public class main {
    private static HashSet&lt;Student> set = new HashSet&lt;Student>();

    public static void main(String&#91;] args) {
        System.out.println("*********************************");
        System.out.println("*\t\t\t\t*");
        System.out.println("*\t欢迎使用学生信息管理系统\t*");
        System.out.println("*\t\t\t\t*");
        System.out.println("*********************************");
        while (true) {
            menu();
        }

    }

    static void menu() {
        System.out.println("1、添加学生信息");
        System.out.println("2、删除学生信息");
        System.out.println("3、修改学生信息");//地址传递
        System.out.println("4、查询学生信息");//name
        System.out.println("请输入操作，以Enter键结束:");
        Scanner in;
        in = new Scanner(System.in);
        int option = in.nextInt();
        switch (option) {
            case 1:
                System.out.println("添加");
                System.out.println("依次输入 姓名 学号 电话 性别");
                Student Tstu = new Student(in.next(), in.next(), in.next(), in.next());
                if (set.contains(Tstu)) {
                    System.out.println("已经添加过");
                } else {
                    set.add(Tstu);
                }
                break;
            case 2:
                System.out.println("输入学号");
                String id2 = in.next();
                if (!set.contains(id2)) {
                    System.out.println("未查询到");
                    return;

                } else {
                    set.remove(id2);
                }
                break;
            case 3:
                System.out.println("输入学号");
                String id3 = in.next();
                if (!set.contains(id3)) {
                    System.out.println("未查询到");
                    return;

                } else {
                    for (Student stu : set) {
                        if (stu.getSno().equals(id3)) {
                            System.out.println("依次输入 姓名 学号 电话 性别");
                            stu.setName(in.next());
                            stu.setSex(in.next());
                            stu.setSno(in.next());
                            stu.setTel(in.next());
                            System.out.println("添加成功");
                            return;
                        }
                    }
                }
                break;
            case 4:
                System.out.println("输入学号");
                String id = in.next();
                if (!set.contains(id)) {
                    System.out.println("未查询到");
                    return;

                } else {
                    for (Student stu : set) {
                        if (stu.getSno().equals(id)) {
                            System.out.println(in.next());
                            return;
                        }
                    }
                }

                break;
            default:
                System.out.println("I'm Sorry,there is not the " + option + " option,please try again.");
        }
    }

}
</code></pre>



<p class="is-style-iw-2em">Student类</p>



<pre class="wp-block-code"><code>package com.cztcode.student;

import java.util.Objects;

public class Student {
    private String name;
    private String sno;
    private String tel;
    private String sex;

    Student(String string){
        this.sno=string;
    };

    @Override
    public int hashCode() {
        return Objects.hash(sno);
    }

    public Student(String name, String sno, String tel, String sex) {
        super();
        this.name = name;
        this.sno = sno;
        this.tel = tel;
        this.sex = sex;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSno() {
        return sno;
    }
    public void setSno(String sno) {
        this.sno = sno;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return sno.equals(student.sno);
    }



}
</code></pre>



<p class="is-style-iw-2em">主要使用了set的几个方法。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/1950/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1950</post-id>	</item>
	</channel>
</rss>
