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 }