30天学通Java Web项目案例开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.6 登录及注销模块

进入系统进行管理时,首先要进行登录验证,以防止非法人员进入,造成数据错误,给公司带来损失。本节将开发该登录模块,实现用户的验证,开发完成后界面如图2-14所示。

图2-14 登录页面

2.6.1 登录页面的设计

登录界面的开发比较简单,只需要让用户输入用户名和密码即可,因此在此不再进行详细介绍,其具体代码如下所示。

代码位置:见光盘中本章源代码的adminlogin.jsp

1   <%@ page contentType="text/html; charset=gbk" %>
2   ……<!-- 此处省略了一些头标记,请读者查阅光盘中本章源代码 -->
3        <script language="JavaScript" src="script/trim.js"></script>
4        <script language="JavaScript">
5            function check(){
6                var uname = document.all.uname.value;          //得到用户名
7                var upwd = document.all.upwd.value;            //得到密码
8                if(uname.trim()==""){                          //当用户名为空时
9                     alert("用户名为空,请重新输入!!!");        //弹出对话框
10                    return false;
11               }
12               if(upwd.trim()==""){                           //当密码为空时
13                    alert("密码为空,请重新输入!!!");          //弹出提示对话框
14                    return false;
15               }
16               return true;
17           }
18       </script>
19   ……<!--此处省略了用户输入的HTML代码,请读者自行查阅光盘中本章源代码 -->

说明:由于登录界面过于简单,在此省略了其中的HTML代码,其中3~18行对用户输入的用户名和密码进行本地验证,防止其为空时传送到服务器端。开发完该页面后,将该页面复制到webapps/POS目录下,启动Tomcat,输入相应网址即可查看效果。

2.6.2 Servlet的配置

上一节中对登录界面进行了开发,在登录页面中,当用户输入完用户名和密码,单击“登录”按钮后就会将登录动作传递到Servlet端,在开发Servlet前,首先要对其进行配置。请在本应用的web.xml文件中的“</web-app>”标记之前添加如下配置:

<servlet>
    <servlet-name>ManageServlet</servlet-name>           <!-- Servlet的名字 -->
    <servlet-class>wyf.zrk.ManageServlet</servlet-class> <!-- Servlet的类名 -->
</servlet>
<servlet-mapping>
    <servlet-name>ManageServlet</servlet-name>           <!--Servlet的映射名-->
    <url-pattern>/ManageServlet</url-pattern>
</servlet-mapping>

2.6.3 登录动作的实现

上一节中对Servlet进行了配置,本节将会开发Servlet类,并对用户的登录动作进行实现,具体的开发代码如下所示。

代码位置:见光盘中本章源代码的ManageServlet.java

1   public class ManageServlet extends HttpServlet{
2        public void doGet(HttpServletRequest request,HttpServletResponse response)
3                     throws ServletException,IOException{
4            this.doPost(request,response);                            //调用doPost方法
5        }
6        public void doPost(HttpServletRequest request,HttpServletResponse response)
7                     throws ServletException,IOException{
8            request.setCharacterEncoding("gbk");              //设置请求编码格式
9            response.setCharacterEncoding("gbk");             //设置响应编码
10           response.setContentType("text/html;charset=gbk"); //设置请求页面格式
11           HttpSession session = request.getSession();       //获取会话对象
12           UserBean userBean = (UserBean)session.getAttribute("userBean");
13           f(userBean==null){userBean = new UserBean();} //JavaBean为空时创建一个
14           WebApplicationContext wac=                  //获取应用上下文
15             WebApplicationContextUtils.getWebApplicationContext(this.get
ServletContext());
16           DButil db = (DButil)wac.getBean("DButil"); //得到数据应操纵类对象
17           DBinsert dbin = (DBinsert)wac.getBean("DBinsert");//得到数据插入类对象
18           DBupdate dbup = (DBupdate)wac.getBean("DBupdate"); //得到数据更新类对象
19           DBdelete dbde = (DBdelete)wac.getBean("DBdelete");//得到数据删除类对象
20           String action = request.getParameter("action").trim(); //得到请求动作
21           if(action.equals("login")){                     //动作为登录时
22               String aname = request.getParameter("uname").trim();//得到用户名
23               String apwd = request.getParameter("upwd").trim();//得到密码
24               aname = new String(aname.getBytes(),"ISO-8859-1"); //将用户名转码
25               apwd = new String(apwd.getBytes(),"ISO-8859-1");  //将密码转码
26               String hql = "from AdminInfo as p "+//搜索管理员对象的HQL语句
27                    "where p.aname='"+aname+"' and p.apwd='"+apwd+"'";
28               List<AdminInfo> list = (List<AdminInfo>)db.getInfo(hql);
29               String url = "";                     //记录提示信息
30               if(!list.isEmpty()){                 //当列表不为空时,代表输入合法
31                    AdminInfo ai = list.get(0);     //得到管理员对象
32                    url = "/index.jsp";             //设置目的页面
33                    session.setAttribute("admin",aname);//将管理员名存入会话中
34                    session.setAttribute("alevel",ai.getAlevel());
                                                               //将管理员级别存入会话中
35               }
36               else{
37                    String msg = "对不起,登录失败!!!";   //登录失败提示信息
38                    request.setAttribute("msg",msg);     //将错误信息添加到请求中
39                    url = "/info.jsp";
40               }
41               ServletContext sc = getServletContext();//得到上下文
42               RequestDispatcher rd = sc.getRequestDispatcher(url);
43               rd.forward(request,response);             //页面跳转
44  }}}

● 第8~10行用来设置响应和请求的编码格式为GBK,第11行得到Session对象,第12行得到JavaBean对象,第13行当该对象不存在时,重新创建一个。

● 第14~15行获取WebApplicationContext对象,第16~19行得到Spring的几个受管Bean对象,在后面的开发过程中,将会对其进行介绍。

● 第20行得到客户端传来的请求动作,第22~25行得到用户输入的用户名和密码,并对其进行转码,第26~28行对用户的正确性进行验证,其中的getInfo方法将会在下一节中介绍。

说明:请将编译好的Servlet的class文件复制到WEB-INF/classes目录下,当对Servlet进行改动后,要将新的类文件编译好后复制到该目录下,重启Tomcat进行测试。

2.6.4 业务方法的实现

上一节中调用了DButil类的getInfo方法,并用到了HQL语言进行查询。用HQL语言时,首先需要开发一个JavaBean类,并将数据库中的AdminInfo表与其进行映射,由于JavaBean的开发比较简单,在此不再赘述,下面将介绍将AdminInfo表与其对应JavaBean进行映射的配置。

请在WEB-INF/classes目录下新建AdminInfo.hbm.xml文件,并在其中添加如下内容:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
    package="org.hibernate.auction">
    <class name="wyf.zrk.AdminInfo" table="AdminInfo">
          <id name="aid" type="java.lang.String"></id>
          <property name="aname" not-null="true" length="50" column="'aname'"/>
          <property name="apwd" not-null="true" length="20" column="'apwd'"/>
          <property name="alevel" not-null="true" length="20" column="'alevel'"/>
    </class>
</hibernate-mapping>

配置完该文件后,还需要将web.xml文件中对Hibernate配置中的映射资源中的<value>AdminInfo.hbm.xml</value>进行解注释。

配置好映射文件后,就可以使用HQL语言来对AdminInfo表进行操作了,但在DButil类操作之前需要对该类进行配置,使其作为Spring的一个受管Bean,请在appcontext.xml文件中的“</beans>”标记前添加如下配置:

<bean id="DButil" class="wyf.zrk.DButil">
    <property name="sf">
      <ref local="sessionFactory" /> <!--将LocalSessionFactoryBean注入到该类中-->
    </property>
</bean>

当上述一切都配置完成后,就可以开发DButil类的getInfo方法了,其具体实现如下所示。

1   public class DButil {
2        private SessionFactory sf;                   //声明引用
3        public SessionFactory getSf(){               //获取会话工厂的方法
4            return this.sf;                          //返回
5        }
6        public void setSf(SessionFactory sf){        //设置会话工厂的方法
7            this.sf = sf;                            //赋值
8        }
9        public List<?> getInfo(String hql){        //用于得到查询列表
10           Session sess = sf.openSession();         //创建会话
11           Query q = sess.createQuery(hql);         //执行查询
12           List<?> list = q.list();               //得到结果列表
13           sess.close();                            //关闭会话
14           return list;                             //将结果列表返回
15  }}

● 第2~7行是对LocalSessionFactoryBean对象的声明及实现对其的set及get方法。

● 第9~15行用于接收一句HQL语句,返回执行查询后得到的列表。

2.6.5 注销动作的实现

管理人员在完成完管理操作后,需要注销账号,以保证安全性。当用户单击页面顶部的“注销”按钮后,其动作将会传送到Servlet端,Servlet会对其进行处理,请在Servlet类中doPost

方法的最后添加如下代码来实现账户的注销。

代码位置:见光盘中本章源代码的ManageServlet.java

1   else if(action.equals("logout")){                   //当管理员注销时
2        request.getSession(true).invalidate();          //使会话失效
3        response.sendRedirect("adminlogin.jsp");        //页面跳转
4   }