关于jsp连接Oracle进行用户登录的方法文档总结:
注:前面的部分为我在自己学习过程中分步记录的,在文档最后会再给出完成源码
一、数据库
数据库表的创建
表非常简单,SQL语句:
create table user(
u_no number(10) not null,
u_pwd varchar2(16) not null,
u_name varchar2(8),
u_email varchar2(18),
u_state varchar2(18),
h_id number(10) ,
primary key(u_no)
);
因为只有用户登录功能,只建一个表就好了。
二、JSP端的开发:
第一步:新建一个Web project。
第二步:
前台登录界面:
<form action="MyServlet" method="post">
< !—-使用post提交表单,并且进入名字为Myservlet的action -->
<table border="0">
<tr>
<td colspan="2" class="arinfo3" align="center">登录</td>
</tr>
<tr>
<td>用户名:</td>
<td><input name="u_no" size="15" class="f2_input"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="u_pwd" size="15" class="f2_input"/></td>
</tr>
<tr>
<td><input class="btn" type="submit" value="登录"/></td>
<td><a href="register.jsp" target="content">注册</a></td>
</tr>
</table>
<input type="hidden" name="action" value="login" />
</form>
通过from表单向服务器中已写好的MyServlet传递用户名以及密码的信息
Myservlet的方式为GET与POST方式,
GET方式提交的网址不能超过256个字符,如果要提交大量的文本,需要使用POST方式,POST提交数据时,数据不在浏览器地址中显示。
其中应用到了Servlet中的HttpServlet类,
即
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
和
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
用来处理Http请求和生成Http响应。
Myservlet的代码如下:
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class MyServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyServlet()
{
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding(CHAR_ENCODING); //将客户端请求的编码设置为CHAR_ENCODING(GBK)编码
//**************
//PrintWriter pw;
//HttpSession hs;
//int time = 10;
//*************
String action = (String)request.getParameter("action"); //获取action
System.out.println("MyServlet===== action:"+action);
if(action.equals("login")){ //action为登录信息
String u_no = (String)request.getParameter("u_no"); //使用HttpServletRequest接口的getParameter()读取用户名参数
String u_pwd = (String)request.getParameter("u_pwd"); //使用HttpServletRequest接口的getParameter()读取密码参数
ArrayList<String> result = DBUtil.checkLogin(u_no, u_pwd); //查询数据库
if(result.size()>1) //如果列表长度大于1,表示登录成功
{
HttpSession session = request.getSession();
String no = result.get(0); //获得用户的号码
String name = new String(result.get(1).getBytes("ISO-8859-1"),CHAR_ENCODING); //获得用户的昵称
String email = result.get(2); //获取用户电子邮件
String state = new String(result.get(3).getBytes("ISO-8859-1"),CHAR_ENCODING); //获取用户状态
String hid = result.get(4); //获取用户头像
User user = new User(no, name, email, state, hid);
session.setAttribute("user", user); //将用户id加入Session
}
else
{
request.setAttribute("loginResult", result.get(0));
}
request.getRequestDispatcher("login.jsp").forward(request, response);
}
else if(action.equals("register"))
{
//action为注册信息
String u_no = (String)request.getParameter("u_no");
String u_name = (String)request.getParameter("u_name");
String u_pwd = (String)request.getParameter("u_pwd");
String u_email = (String)request.getParameter("u_email");
String u_state = (String)request.getParameter("u_state");
String result = DBUtil.registerUser(u_no,u_name, u_pwd, u_email, u_state,"0");
if(!result.equals(REGISTER_FAIL)){ //注册成功
User user = new User(result, u_name, u_email, u_state, "0");
HttpSession session = request.getSession();
session.setAttribute("user", user);
}
request.setAttribute("result", result);
request.getRequestDispatcher("register.jsp").forward(request,response);
}
else if(action.equals("logout")){ //action为注销登陆
HttpSession session = request.getSession();
session.setAttribute("user", null);
request.getRequestDispatcher("login.jsp").forward(request,response);
}
else if(action.equals("gotoregister")){ //action为注册
System.out.println("hahahahhh");
request.getRequestDispatcher("register.jsp").forward(request, response);
}
}
}
但是光有Servlet还是不行的,Web容器必须知道浏览器如何访问这个Servlet.,这个配置在Web.xml中。
代码:
<servlet>
<description></description>
<display-name>MyServlet</display-name>
<servlet-name>MyServlet</servlet-name>
<servlet-class>wpf.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
其中,<servlet-name>和<servlet-class>是必须的,<servlet-name>必须在web.xml中是必须的。
配置好servlet名称与类名后还需要配置Servlet的访问形式。<servlet-mapping>中的<url-pattern>就是配置该servlet的访问方式,<url-pattern>值前面加上的是web应用程序的路径
<url-pattern>中允许通配符“*”与“?”。
其中把checkLogin的方法与写数据库连接的方法写在了一起,这里使用的是JDBC进行Oracle连接,方法名为DButil
方法如下:
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
public static Connection getConnection(){
Connection con = null;
//使用JDBC直接访问数据库
try{ Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
//为指定的数据库进行连接
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");
}
catch(Exception e){
try{
con.close();
}catch(Exception ea){
ea.printStackTrace();
}
e.printStackTrace();
}
return con;
}
//验证用户名密码的方法:
public static ArrayList<String> checkLogin(String u_no,String u_pwd){ //List 接口的大小可变数组的实现
ArrayList<String> result = new ArrayList<String>();
Connection con = null; //声明获取数据库连接
PreparedStatement ps = null;//声明Statement对象,将SQL语句存入ps变量中
ResultSet rs = null; //声明ResultSet对象
try{
con = getConnection(); //获取数据库连接
if(con == null){ //判断数据库连接对象是否
result.add(CONNECTION_OUT); //CONNECTION_OUT为另一方法中的String对象
return result;
}
ps = con.prepareStatement("select u_no,u_name,u_email,u_state,h_id from userlist where u_no=? and u_pwd=?");
ps.setString(1, u_no); //设置预编译语句的参数
ps.setString(2, u_pwd); //设置预编译语句的参数
rs = ps.executeQuery();
if(rs.next()) //判断结果集rs是否有记录,并且将指针后移一位
{ //判断结果集是否为空
for(int i=1;i<=5;i++)
{
result.add(rs.getString(i)); //将结果集中数据存放到ArrayList中
}
}
else
{ //如果数据库查无此人
result.add(LOGIN_FAIL); //返回登录出错信息
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try{
if(rs != null){
rs.close();
rs = null;
}
}catch(Exception e){
e.printStackTrace();
}
try{
if(ps != null){
ps.close();
ps = null;
}
}catch(Exception e){
e.printStackTrace();
}
try{
if(con != null){
con.close();
con = null;
}
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}