Java学习笔记.docx
- 文档编号:30077580
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:26
- 大小:31.22KB
Java学习笔记.docx
《Java学习笔记.docx》由会员分享,可在线阅读,更多相关《Java学习笔记.docx(26页珍藏版)》请在冰豆网上搜索。
Java学习笔记
连接数据库需要经过以下几个步骤:
1、根据驱动程序名称driverName,利用Java反射机制,加载数据库驱动程序;
2、根据连接字符串connectionURL,从驱动管理器中获取数据库连接对象;
3、利用数据库连接对象进行数据库操作。
代码如下:
ClassproviderClass=Class.forName(driverName);
Connection=DriverManager.getConnection(connectionURL,username,password);
returnconnection;
不同数据库的驱动程序和连接字符串:
MySQL:
驱动程序名称
com.mysql.jdbc.Driver
连接字符串
jdbc:
mysql:
//
useUnicode=true&characterEncoding=GBK
SQLServer:
驱动程序名称
com.microsoft.jdbc.sqlserver.SQLServerDriver
连接字符串
jdbc:
microsoft:
sqlserver:
//
1433;DatabaseName=
Oracle:
驱动程序名称
oracle.jdbc.driver.OracleDriver
连接字符串
jdbc:
oracle:
thin:
@
1521:
DB2:
DB2的JSP连接方式有APP驱动、NET驱动和JCC驱动三种方式。
APP方式:
驱动程序名称
COM.ibm.db2.jdbc.app.DB2Driver
连接字符串
jdbc:
db2:
NET方式:
驱动程序名称
COM.DB2Driver
连接字符串
jdbc:
db2:
//
6789/
JCC方式:
驱动程序名称
COM.ibm.db2.jdbc.jcc.DB2Driver
连接字符串
jdbc:
db2:
//
50000/
连接数据库常见问题:
1、系统抛出异常java.lang.ClassNotFoundException。
例如:
java.lang.ClassNotFoundException:
com.mysql.jdbc.Driver
这说明试图初始化驱动程序的时候出错,在Class.forName()中,Java虚拟机无法在类路径中找到指定驱动名称的驱动类。
需要把包含驱动类的mysql-connector-java-x.xx.xx-bin.jar文件放置在运行的类路径WEB-INF/lib下。
2、系统抛出异常.SocketException:
ConnectionRefused,连接被拒绝。
1)如果数据库服务器未开启或无法建立连接,则抛出异常如下:
.SocketException:
.ConnectionException:
Connectionrefused:
connect
首先确定连接字符串中的URL配置中IP是否正确,端口是否正确,同时需要确保服务器已经启动接受服务请求。
2)如果确定服务器已经启动,那么可以查看配置,看数据库对外服务的端口是否为默认端口,抑或有所改动。
3)如果服务器已经启动,而且采用了默认端口,那么需要查证服务器上是否安装了网络防火墙,阻断了数据库连接请求。
3、如果调用DriverManager.getConnection(connectionURL,username,password)中username和password不正确,那么驱动程序将抛出如下异常:
java.sql.SQLException:
Accessdeniedforuser‘root’@’localhost’(usingpassword:
YES)
需要修改用户名和口令后重新进行连接。
4、由于数据库驱动和数据库服务器的版本不匹配,导致了连接失败。
B/S结构和C/S结构的区别:
信息管理系统的发展经历了4个阶段:
主机终端阶段,文件服务器阶段,客户机服务器(Client/Server,简称C/S)阶段,浏览器服务器(Browser/Server,简称B/S)阶段。
C/S的可视化开发工具较多,软件产品可操作性强,但是C/S生来便带着致命的弱点:
需要在各个客户机上安装、运行以及维护程序,而且服务器直接暴露在网络上,给安全带来了严重威胁。
B/S基于浏览器的策略,简化了客户端。
B/S软件无须在不同的客户机安装客户端软件,只要通过通用的浏览器工具,就可以使用系统。
由于各个操作系统下都提供了浏览器,而且都遵循共同的规范,因此,B/S可以使得客户端很容易的实现跨平台。
由于B/S系统采用HTTP协议通信,很容易穿透防火墙,而不像C/S系统对于网络环境有较高的要求。
如何处理中文乱码问题:
1、JSP输出中文乱码问题
这种乱码问题往往是因为没有给JSP页面制定显示字符的编码方式,解决方法如下:
1)在JSP页面头部加上语句<%@pagecontentType=”text/html;charset=utf-8”%>(在Servlet中使用httpServletResponse.setContentType(“text/html;charset=utf-8”)),最好同时在JSP页面的head部分加上
2)在每次要输出中文的地方主动转换编码方式。
<%
Stringstr=“中文”;
byte[]tempbyte=str.getBytes(“ISO8859_1”);
str=newString(tempbyte);
out.print(str);
%>
2、获取表单提交的数据时的中文乱码问题
解决此问题的办法有两个。
一是不修改其他配置,只是在将表单中的中文数据取出来再转换编码,方法如语句Stringstr=request.getParameter(“chStr”);Stringstr=newString(str.getBytes(“ISO8859_1”),“utf-8”),但这种方法只是从一个局部来考虑问题,如果这样的问题很多,就不得不将这条语句重复写很多次,在比较大的项目中,这是一个不太可行的方案。
另一种方法是让对所有页面的请求都通过一个Filter,将处理字符集设置库utf-8。
具体的做法如下(在Tomcat的webapp/servlet-examples目录有一个完整的例子,也可以参考其中web.xml和SetCharacterEncodingFilter的配置):
首先将%TOMCAT%/webapps/servlet-examples/WEB-INF/classes/filters/目录下的文件SetCharacterEncodingFilter.class拷到自己应用的/WEB-INF/classes/…/filter目录下;然后在web.xml文件的
Tomcat自带的例子中有SetCharacterEncodingFilter.class的源码,其中最关键的一点是利用语句request.setCharacterEncoding(encoding)设置的request的字符编码方式。
3、URL中的中文问题
对于直接通过在URL中传递中文参数,如“http:
//localhost/a.jsp?
str=中文”这样的get请求,在服务端用request.getParameter(“name”)时返回的往往是乱码。
按以上的做法设置Filter没有用,用request.setCharacterEncoding(“utf-8”)的方式,仍然不管用。
造成这种结果的原因是Tomact中以get方式提交的请求query-string处理时采用了和post方法不一样的处理方式。
解决这个问题的方法是打开Tomcat安装目录下的/conf/server.xml文件,找到Connector块,往其中添加URIEncoding=”utf-8”,添加过后完整的Connector块代码如下:
4、数据库访问时的乱码问题
在使用JDBC连接MySQL数据库时,连接字符串写成如下形式可以避免一些中文问题:
jdbc:
//mysql:
//localhost:
prot/DBname?
user=username&password=pwd&useUnicode=true&characterEncoding=utf-8
如果是以数据源的方式连接数据库,在配置文件中使用:
mysql:
//loclahost:
port/DBname?
&useUnicode=true&
characterEncoding=utf-8
如果使用一个已经存在的数据库,数据库的编码方式库ISO8859-1,而Web应用中使用utf-8,且数据库中已经有很多重要信息,因此不能通过更改数据库的编码方式来解决问题。
这个时候,在往数据库中写数据时,一定要在JDBC连接字符串中加入“useUnicode=true&characterEncoding=ISO-8859-1”,这样可以顺利地往数据库中写入正常的数据。
但是在将数据读出数据库时,乱码又会出现,这个时候就应该在数据取出时对其转码,可以将转码功能写库一个函数,具体实现如下:
publicStringcharConvert(Stringstr){
Stringresult=null;
if(str!
=null){
try{
result=newString(str.getBytes(“ISO-8859-1”),“utf-8”);
}catch(Exceptione){
result=null;
}
}
returnresult;
}
在从数据库中读出数据后调用charConvert(rs.getString(“colName”)),这样就可以正常显示数据库中的中文数据了。
使用JavaMail发送注册验证邮件:
JavaMail是Sun发布的用来处理E-mail的API,它可以方便地执行一些常用的邮件传输。
虽然JavaMail是Sun的API之一,但它没有被加在标准的Java开发工具包(JDK)中,这就意味着使用之前必须另外下载JavaMail文件(http:
//),除此之外,要使用JavaMail,还需要有Sun的JavaBeansActivationFramework(JAF)支持,因此需要下载一个叫activation.jar的文件,将他们同时放在应用的lib目录下或其他Classpath包含的目录。
发送邮件过程中主要使用到的几个类:
1.Javax.mail.Session类
Session定义了一个基本的邮件会话,任何工作都是基于这个Session的。
Session对象需要一个java.util.Properties对象得到类似邮件服务器、用户名、密码这样的信息。
Session的构造函数是私有的,可以通过getDefaultInstance()方法取得一个单一的可以被共享的默认Session,如:
Propertiesprops=newProperties();
……
Sessionsession=Session.getDefaultInstance(props,null);
或者,可以通过getInstance()方法来创建一个惟一的Session,如:
Propertiesprops=newProperties();
……
Sessionsession=Session.getInstance(props,null);
2.Javax.mail.Message类
创建了Session对象后,就要创建Message来发送Session。
Message是一个抽象类,在大部分应用中可以使用它的子类Javax.mail.internet.MimeMessage。
创建Message的方法如下:
MimeMessagemessage=newMimeMessage(session);
设置内容(content)的基本机制是使用setContent()方法:
message.setContent(“EmailContent.”,“text/plain”)。
如果能够明确地使用MimeMessage来创建Message,并且只是使用普通的文本(plaintext),那么也可以使用setText(“EmailContent.”)。
如果要创建其他类型的Message,如HTML类型的Message,那么还是使用前者message.setContent(“EmailContent.”,“text/html”)。
设置主题(subject),使用setSubject()方法:
message.setSubject(“Subject”)。
3.Javax.mail.Address类
Address是一个抽象类,可以使用它的子类javax.mail.internet.InternetAddress。
创建一个Address语句如下:
Addressaddress=newInternetAddress(“test@”);
如果希望在出现邮件地址的地方显示一个名称,那么只需要再多传递一个参数。
Addressaddress=newInternetAddress(“test@”,“Kylen”);
除此,需要为Message的from以及to字段创建address对象。
为了识别发送者,使用setFrom()和setReplyTo()方法。
message.setFrom(address);
如果需要显示多个from地址,可以使用addFrom()方法:
Addressaddress[]={……};
message.addFrom(address);
为了辨识Message的收件人,需要使用setRecipient()方法。
message.addRecipient(type,address);
Message.RecipientType有几个预先定义好的类型:
Message.RecipientType.To收件人
Message.RecipientType.CC抄送
Message.RecipientType.BCC暗送
同时发给多个人:
AddresstoAddress=newInternetAddress(“manager@”);
Address[]ccAddress={newInternetAddress(“colleague1@”),
newInternetAddress(“colleague2@”)};
message.addRecipient(Message.RecipientType.To,toAddress);
message.addRecipient(Message.RecipientType.CC,ccAddress);
4.Javax.mail.Transport类
最后,需要使用一个Transport类来完成邮件发送,可以通过两种方法发送邮件。
Transport是一个抽象类,可以调用它的静态的send()方法来发送:
Transport.send(message);
或者,可以从Session中为所使用的协议取得一个指定的实例:
Transporttransport=session.getTransport(“smtp”);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
经过以上的介绍,要用JavaMail发送一封普通的邮件就变得相当容易了。
本实例编写了一个专门用于邮件处理的类MailUtil.java,其源代码如下:
packagech2.util.mail;
importjava.util.Date;
importjava.util.Properties;
importjavax.mail.Message;
importjavax.mail.MessagingException;
importjavax.mail.NoSuchProviderException;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeMessage;
publicclassMailUtil{
staticintport=25;//smtp端口
staticStringserver="";//smtp服务器地址
staticStringfrom="Webmaster
staticStringuser="kylen@";//发送者地址
staticStringpassword="1141940938";//密码
publicstaticvoidsendEmail(Stringemail,Stringsubject,Stringbody){
try{
Propertiesprops=newProperties();
props.put("mail.smtp.host",server);
props.put("mail.smtp.port",String.valueOf(port));
props.put("mail.smtp.auth","true");
Transporttransport=null;
Sessionsession=Session.getDefaultInstance(props,null);
transport=session.getTransport("smtp");
transport.connect(server,user,password);
MimeMessagemsg=newMimeMessage(session);
msg.setSentDate(newDate());
InternetAddressfromAddress=newInternetAddress(from);
msg.setFrom(fromAddress);
InternetAddress[]toAddress=newInternetAddress[1];
toAddress[0]=newInternetAddress(email);
msg.setRecipients(Message.RecipientType.TO,toAddress);
msg.setSubject(subject,"UTF-8");
msg.setText(body,"UTF-8");
msg.saveChanges();
transport.sendMessage(msg,msg.getAllRecipients());
}catch(NoSuchProviderExceptione){
e.printStackTrace();
}catch(MessagingExceptione){
e.printStackTrace();
}
}
}
不安全的用户名密码验证:
在验证用户名和密码时使用的方法是,先用用户名(uid)得到一个User类型的对象user,再用equals方法匹配user的password属性和表单提交的password数据是否相等。
为什么要这样做呢?
为什么不直接将表单提交的数据uid和password传递到DAO类,然后编写如下的查询语句,如果有结果返回则表明登录成功?
SELECT*FROMuserWHEREuid=”+‘uid’+”andpassword=”‘+password+’”
这是许多初学者和经验不足的程序员会写出的语句,表面上看起来这样的语句没有任何问题,可是当遇到有意图的破坏者,这将会产生严重的后果。
试想,如果用户在登录表单的密码输入框中输入的内容为“‘or’‘1’=‘1’”,而不管在用户名输入框中输入什么内容,以上的SQL语句组合完毕过后将有如下的形式:
SELECT*FROMuserWHEREuid=’asdf’andpassword=’’or‘1’=‘1’
显然,无论用户名输入什么,这条语句总能将user表中的所有内容查出来,也就是说,破坏者只需要输入一些特殊的字符就可以轻易地登录到系统,这无疑是一个极大的漏洞,潜在的损失也就是不可估量的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 学习 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)