使用Struts1完成用户登录功能

1、Struts框架

框架(framework):就是一系列代码和开发模式的整合,使用框架后,所有开发人员都会按照框架提供的规范进行开发,使代码更容易维护和扩展。

使用框架的优点:

1)   易于维护扩展

2)   简化代码

 

Struts框架是MVC模式的具体实现框架,实现针对MVC模式中的Servlet以及jsp页面代码的简化。

 

JSP + Servlet 的执行流程:

jsp à web.xml中查找<servlet-mapping>找到进入哪个Servlet à 执行doGet或doPost方法,接收参数,验证,整合,调用service,设置属性,跳转 à 返回jsp。

 

Struts执行流程中主要修改了Servlet部分,不需要再编写Servlet,但需要建立Action和ActionForm,将Servlet中主要实现的功能也拆分为两部分,其中对于参数的处理交给ActionForm来执行,其他操作由Action实现。

 

在jsp页面上,不再使用JSTL,改为Struts-Taglib,可以替代JSTL标签完成循环,判断,格式化等操作,并扩展了新的功能,替代原有页面表单,形成动态表单,支持自动回填功能。

 

Struts不对数据库操作代码产生任何影响,DAO还是使用原有的JDBC。

 

2、使用Struts完成用户登录功能

假设用户输入用户名为zhangsan,密码为123表示登陆成功,否则登陆失败。

建立项目,加入Struts1.3支持。

加入支持后,项目中多出以下内容:

1)   src下的资源文件(ApplicationResources.properties)

2)   支持类库

3)   struts-config.xml

web.xml中加入ActionServlet配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 3   <display-name />
 4   
 5   <!-- Struts的配置 -->
 6   <servlet>
 7     <servlet-name>action</servlet-name>
 8     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
 9     <init-param>
10       <!-- 可以配置多个配置文件,中间使用逗号隔开 -->
11       <param-name>config</param-name>
12       <param-value>/WEB-INF/struts-config.xml</param-value>
13     </init-param>
14     <init-param>
15       <param-name>debug</param-name>
16       <param-value>3</param-value>
17     </init-param>
18     <init-param>
19       <param-name>detail</param-name>
20       <param-value>3</param-value>
21     </init-param>
22     <load-on-startup>0</load-on-startup>
23   </servlet>
24   <servlet-mapping>
25     <servlet-name>action</servlet-name>
26     <url-pattern>*.do</url-pattern>
27   </servlet-mapping>
28   
29   
30   <welcome-file-list>
31     <welcome-file>index.jsp</welcome-file>
32   </welcome-file-list>
33 </web-app>

 

如果想不使用MyEclipse加入支持,可以从apache官方网站上下载开发包,从开发包中找到这些配置,并加入项目。

在index.jsp中导入struts的html标签,并完成登陆表单

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
 3 <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 6 %>
 7 
 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 9 <html>
10   <head>
11     <base href="<%=basePath%>">
12     
13     <title>登陆页面</title>
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22   </head>
23   
24   <body>
25     <html:form method="post" action="login.do" >
26        <br>用户ID:<html:text property="userid"></html:text>
27        <br>密码:<html:password property="password"></html:password>
28        <br><html:submit value="登陆"></html:submit>
29     </html:form>
30   </body>
31 </html>

 

改为标签形式,其中property就是之前普通元素的name。

下面建立提交后接收信息和处理的ActionForm与Action

 

path表示进入此Action以及ActionForm的提交路径,以 / 开头。

Input Source表示出错后自动跳转的错误页路径。

Finish完成后,会在struts-config.xml中自动生成配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
 3 
 4 <struts-config>
 5   <form-beans >
 6     <!-- 配置的LoginForm -->
 7     <form-bean name="loginForm" type="lq.wangzhen.struts.form.LoginForm" />
 8   </form-beans>
 9 
10   <global-exceptions />
11   <global-forwards />
12   <action-mappings >
13     <!-- Action配置选项,指定对应的跳转路径path,错误路径input,和对应的form name -->
14     <action
15       attribute="loginForm"
16       input="/index.jsp"
17       name="loginForm"
18       path="/login"
19       scope="request"
20       type="lq.wangzhen.struts.action.LoginAction"
21       cancellable="true" />
22   </action-mappings>
23 
24   <message-resources parameter="lq.wangzhen.struts.ApplicationResources" />
25 </struts-config>

 

先编写ActionForm接收参数,并验证。

 1 /*
 2  * Generated by MyEclipse Struts
 3  * Template path: templates/java/JavaClass.vtl
 4  */
 5 package lq.wangzhen.struts.form;
 6 
 7 import javax.servlet.http.HttpServletRequest;
 8 
 9 import org.apache.struts.action.ActionErrors;
10 import org.apache.struts.action.ActionForm;
11 import org.apache.struts.action.ActionMapping;
12 import org.apache.struts.action.ActionMessage;
13 public class LoginForm extends ActionForm {
14     /**
15      * 变量名称和表单中的变量名称一致,会自动的进行接收,但要编写对应的setter和getter方法
16      */
17     private String userid;
18     private String password;
19     
20     public ActionErrors validate(ActionMapping mapping,
21             HttpServletRequest request) {
22         //验证用户名和密码是否为空
23         ActionErrors errors = new ActionErrors();
24         if(userid == null || "".equals(userid.trim())){
25             errors.add("useridErr",new ActionMessage("userid.null"));
26         }
27         if(password == null || "".equals(password.trim())){
28             errors.add("passwordErr", new ActionMessage("password.null"));
29         }
30         return errors;
31     }
32     public void reset(ActionMapping mapping, HttpServletRequest request) {
33         // TODO Auto-generated method stub
34     }
35     public String getUserid() {
36         return userid;
37     }
38     public void setUserid(String userid) {
39         this.userid = userid;
40     }
41     public String getPassword() {
42         return password;
43     }
44     public void setPassword(String password) {
45         this.password = password;
46     }
47     
48 }

 

validate方法会在接收完参数后由Struts自动调用,验证返回的ActionErrors里如果包含了错误信息,则Struts会自动根据配置的错误页跳转回页面,而不进入Action。

错误信息通过ActionMessage,从资源文件中查找。

ApplicationResources.properties

1 userid.null=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\uFF01
2 password.null=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A\uFF01

 

资源文件中不允许出现中文,因此必须对中文进行转码。

在index.jsp中,提示错误信息

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
 3 <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 6 %>
 7 
 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 9 <html>
10   <head>
11     <base href="<%=basePath%>">
12     
13     <title>登陆页面</title>
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22   </head>
23   
24   <body>
25     <html:form method="post" action="login.do" >
26        <br>用户ID:<html:text property="userid"></html:text>
27        <font color="red"><html:errors property="useridErr"/></font> <!-- 配置用户名错误信息 -->
28        <br>密码:<html:password property="password"></html:password>
29        <font color="red"><html:errors property="passwordErr"/></font>  <!-- 配置密码错误信息 -->
30        <br><html:submit value="登陆"></html:submit>
31     </html:form>
32   </body>
33 </html>

 

在property中传入之前加入错误时设置的key值,就可以取得该错误信息并显示。

如果没有加property,则会取得所有错误信息并显示。

进入Action,在Action中实现其他的操作。

 1 /*
 2  * Generated by MyEclipse Struts
 3  * Template path: templates/java/JavaClass.vtl
 4  */
 5 package lq.wangzhen.struts.action;
 6 
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 import lq.wangzhen.struts.form.LoginForm;
11 
12 import org.apache.struts.action.Action;
13 import org.apache.struts.action.ActionErrors;
14 import org.apache.struts.action.ActionForm;
15 import org.apache.struts.action.ActionForward;
16 import org.apache.struts.action.ActionMapping;
17 import org.apache.struts.action.ActionMessage;
18 
19 public class LoginAction extends Action {
20     public ActionForward execute(ActionMapping mapping, ActionForm form,
21             HttpServletRequest request, HttpServletResponse response) {
22         LoginForm loginForm = (LoginForm) form;
23         if(loginForm.getUserid().equals("wangzhen") && loginForm.getPassword().equals("123")){
24             //登陆成功
25             request.getSession().setAttribute("userid", loginForm.getUserid());
26             //跳转到成功也,这里只给出名称,具体的路径配置到struts-config.xml中
27             return mapping.findForward("success");
28         }else{
29             //登陆失败,自动返回到失败页
30             //还需要保存错误信息
31             ActionErrors errors = new ActionErrors();
32             errors.add("loginErr", new ActionMessage("login.err"));
33             //手工保存错误信息
34             super.saveErrors(request, errors);
35             return mapping.getInputForward();
36         }
37     }
38 }

 

这里配置了跳转路径,需要修改struts-config.xml,将success的路径配置上。

 1  <!-- Action配置选项,指定对应的跳转路径path,错误路径input,和对应的form name -->
 2     <action
 3       attribute="loginForm"
 4       input="/index.jsp"
 5       name="loginForm"
 6       path="/login"
 7       scope="request"
 8       type="lq.wangzhen.struts.action.LoginAction"
 9       cancellable="true" >
10         <forward name="success" path="/pages/success.jsp"></forward>
11       </action>

 

name是跳转路径名称,就是Action中findForward()方法中传入的值

path是具体跳转路径,必须以 / 开头。

在index.jsp中提示错误信息

 1  <body>
 2   <font color="red"><html:errors property="loginErr"/></font>
 3     <html:form method="post" action="login.do" >
 4        <br>用户ID:<html:text property="userid"></html:text>
 5        <font color="red"><html:errors property="useridErr"/></font> <!-- 配置用户名错误信息 -->
 6        <br>密码:<html:password property="password"></html:password>
 7        <font color="red"><html:errors property="passwordErr"/></font>  <!-- 配置密码错误信息 -->
 8        <br><html:submit value="登陆"></html:submit>
 9     </html:form>
10   </body>

 

posted @ 2013-11-14 22:37  悟空65  阅读(573)  评论(0编辑  收藏  举报