Java的Struts框架中登陆功能的实现和表单处理器的使用

实现Struts登录
1、jar包拷贝
首先是建立java web项目,之后打开我们我们下载好strtus框架,Struts-1.2.9-bin文件夹和struts-1.2.9.src源文件文件夹。在bin文件夹中的lib文件中拷贝struts的jar包,拷贝到我们自己项目struts_login –>lib文件夹下。

2、web.xml文件配置
找到Struts-1.2.9-bin中Struts-1.2.9-bin-->webapps下的struts实例struts-blank中的struts-1.2.9-bin\webapps\struts-blank\WEB-INF下的web.xml文件,复制配置对ActionServlet的配置,粘贴到我们的项目struts_login的WEB-INF下的web.xml中,代码如下所示。主要是对struts自带的ActionServlet进行配置。

<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  <init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/struts-config.xml</param-value>
  </init-param>
  <init-param>
   <param-name>debug</param-name>
   <param-value>2</param-value>
  </init-param>
  <init-param>
   <param-name>detail</param-name>
   <param-value>2</param-value>
  </init-param>
  <load-on-startup>2</load-on-startup>
 </servlet> 

 <!--Standard Action Servlet Mapping -->
 <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>

3、在项目中建立自己的ActionForm
在项目中建立自己的ActionForm,继承struts框架中已经写好的ActionForm,在ActionForm设置用到的数据,并且要和我们界面上设置的名称一致。因为我们在提交表单的时候,所有的请求都会放到ActionForm中。建立登录的ActionForm,LoginActionForm.java代码如下所示。

package com.bjpowernode.struts;
import org.apache.struts.action.ActionForm; 

/**
 * 登录ActionForm,负责表单收集数据.
 * 表单的属性必须和ActionForm中的get和set的属性一致.
 * @author summer
 *
 */
public classLoginActionForm extends ActionForm { 

  //用户名。
  private Stringusername;
  //密码。
  private String password; 

  //设置密码。
  public voidsetPassword(Stringpassword) {
    this.password = password;
  }
  //得到用户名。
  public StringgetUsername() {
    return username;
  }
  //设置用户名。
  public voidsetUsername(Stringusername) {
    this.username = username;
  }
  //得到密码。
  public StringgetPassword() { 

    return password;
  } 

}

4、建立自己的Action
建立自己的Action,同时继承struts框架中的org.apache.struts.action.Action,重载父类的execute方法。在这里完成取出表单中的数据。通过CalActionFormcalForm= (CalActionForm)(CalActionForm)form;(struts框架中已经帮我们封装好了,我们去使用就可以了)来取得表单中的值。经过判断后,进行相应的操作,跳转到相应的页面。Action的功能是负责拿到表单数据和调用业务逻辑后进行页面跳转。建立登陆的Action类,LoginAction.java类,调用业务逻辑类UserManager的login方法。代码如下所示。

packagecom.bjpowernode.struts; 

importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse; 

importorg.apache.struts.action.Action;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping; 

/**
 *登录Action
 *负责取得表单数据,调用业务逻辑,返回转向信息.
 *
 * @author summer
 *
 */
public classLoginAction extendsAction { 

   @Override
   public ActionForward execute(ActionMappingmapping,ActionForm form,
          HttpServletRequest request, HttpServletResponseresponse)
          throws Exception { 

       LoginActionForm laf = (LoginActionForm)form;
       Stringusername = laf.getUsername();
       Stringpassword = laf.getPassword(); 

       UserManager userManager = newUserManager();
       //传递用户名和密码
       try
       {
          userManager.login(username, password);
          request.setAttribute("username", username);
          return mapping.findForward("success");
       }catch(UserNotFoundException e)
       {
          e.printStackTrace();
          request.setAttribute("msg","用户不能找到,用户名称=[" +username +"+]");
       }catch(PasswordErrorException e)
       {
          e.printStackTrace();
          request.setAttribute("msg","密码错误");
       } 

       return mapping.findForward("error");
   } 

}

5、  建立struts-config.xml
作为Struts框架的核心描述,struts-config.xml可以说“一切尽在掌握”。它不但描述了MVC模型,定义所有视图层和控制层之间的接口(ActionForm),与控制层和模型层的接口(Action)进行结合,而且可以定义一些附加组件,如国际化信息资源排至文件,标签库信息等。
仍然是站在巨人的肩膀上,将我们下载的struts  bin文件夹中的struts-config.xml文件复制到我们的项目的WEB-INF中,删除struts-config.xml中的注释部分。把Action和ActionForm配置起来。ActionForm放到<form-beans></form-beans>中,Action配置放到<action-mappings></action-mappings>中,struts-config.xml配置代码如下所示。

 <?xml version="1.0" encoding="ISO-8859-1" ?> 

<!DOCTYPE struts-config PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration1.2//EN"
     "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> 

<struts-config>
  <form-beans>
    <form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"/>
  </form-beans> 

  <action-mappings>
    <action path="/login"
       type="com.bjpowernode.struts.LoginAction"
       name="loginForm"
       scope="request"
       >
       <forward name="success" path="/login_success.jsp"/>
       <forward name="error" path="/login_error.jsp"/>
    </action>
  </action-mappings>
</struts-config>

其中form-beans元素中可以定义0个或1个以上的form-bean元素,每个form-bean被认为是一个ActionForm对象,name属性表示form-bean元素的名称,type属性指定其类名和路径。
Action-mappings元素用来包含零到多个action,其子元素action负责具体映射的详细信息。在action-mapping元素中可以定义0个或1个以上的action元素。每个action元素接受path属性定义的请求,并映射到type属性所定义的具体action对象。在映射过程中,将name属性定义的actionform一并传过去,它有如下属性:
Parameter,scope两个属性指定了传送方式和范围,scope常用的值有两个“session”和“request”。
Validate属性指定了是否需要actionform的验证。
Forward元素,将请求success转发到”/login_success.jsp”页面。
6、业务逻辑类UserManager和自定义异常类
代码如下所示:

packagecom.bjpowernode.struts; 

publicclassUserManager { 

   publicvoid login(Stringusername,Stringpassword)
   {
       if(!"admin".equals(username))
       {
          thrownewUserNotFoundException();
       } 

       if(!"admin".equals(password))
       {
          thrownewPasswordErrorException();
       }
   } 

}

自定义异常类UserNotFoundException和PasswordErrorException代码如下所示。

packagecom.bjpowernode.struts; 

public class UserNotFoundExceptionextends RuntimeException { 

   public UserNotFoundException() {
   } 

   public UserNotFoundException(Stringmessage) {
       super(message);
   } 

   public UserNotFoundException(Throwable cause) {
       super(cause);
   } 

   public UserNotFoundException(Stringmessage,Throwable cause) {
       super(message, cause);
   } 

} 

packagecom.bjpowernode.struts; 

public class PasswordErrorExceptionextends RuntimeException { 

   public PasswordErrorException() {
   } 

   public PasswordErrorException(Stringmessage) {
       super(message);
   } 

   public PasswordErrorException(Throwable cause) {
       super(cause);
   } 

   public PasswordErrorException(Stringmessage,Throwable cause) {
       super(message, cause);
   } 

}

7、视图jsp页面调用。
登录界面login.jsp,错误显示界面login_error.jsp,登录成功界面login_success.jsp。代码如下所示。

<%@pagelanguage="java" contentType="text/html; charset=GB18030"
  pageEncoding="GB18030"%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Inserttitle here</title>
</head>
<body>
<form action="login.do" method="post">
  用户:<inputtypeinputtype="text" name="username"><Br>
  密码:<inputtypeinputtype="password" name="password"></br>
  <input type="submit" value="登录">
</form>
</body>
</html>

Login_success.jsp.

<%@page language="java"contentType="text/html;charset=GB18030"
  pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
 ${username},登录成功!
</body>
</html>

Login_error.jsp界面。

<%@page language="java" contentType="text/html; charset=GB18030"
  pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
 <%--
 <%=request.getAttribute("msg") %>
 --%> 

 ${msg }
</body>
</html>

就这样我们实现了运用struts框架完成用户登录。就这样从初步学习到简单应用,随着应用的次数增多,我们会对struts理解越来越深刻,并且感受struts框架给我们带来的便捷。

表单处理器ActionForm(静态动态)
上面讲解了struts配置,实现了使用struts框架进行登录的示例。一些名词已经在脑海中飘荡了。
ActionServlet:struts的控制器,负责截取URL或分发。提供Model(模型层)和View(视图层)使用,因此可将它看作是模型和视图之间的中介。
ActionForm:用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的。
Action:用户请求和和业务逻辑的桥梁,每个Action作为业务逻辑的代理,可以调用业务逻辑。
一些问题是有必要再次提起的。
使用基本的MVC和使用struts框架区别,使用struts好处在哪里?
我们知道我们不适用框架的时候,在MVC中典型的控制器是servlet,servlet可以获取参数和逻辑模型的调用和转向功能。而struts对它做了封装,为什么要进行封装?当我们请求到一个servlet,我们在这个servlet中取得参数、调用业务逻辑、转向,我们在servlet中写死了转向页面,当我们想要换一个转向页面的时候就需要改动代码了,改动代码后还要重新进行编译。
而且从表单中传递过来的数据全是字符串形式,我们还需要根据实际的需求把字符串转换为我们需要的类型,如果很多地方需要转换,并且每次使用每次都要进行转换,有没有一种机制,把表单中的字符串拿过来自动转换为相应的类型呢?不需要我们再进行手动转换呢?
基于上述的不便,转向不灵活,表单中的字符串每次都要进行转换等一系列的原因,struts把这些做了封装。提取出重复的操作,转向信息放到了配置文件中,这样更加灵活了。
在上述问题中,阐述了struts对表单的封装,在web应用程序开发过程中,开发人员需要大量的时间来处理表单问题,有的时候是通过表单提交一些新的问题,有的是通过表单修改数据,所有这些表单在处的处理在传统web开发中是非常复杂的。本篇重点说说struts中的表单处理器ActionForm。
ActionForm
问题的提出
在传统的web应用程序开发中,繁杂的表单处理给开发工作人员带来了巨大的困难,在传统的开发语言中,没有组建可以自动收集用户输入的表单内容,开发人员不得不在程序中手动提取表单的值。例如在表单中有这样的一个文本输入域:<inputtype=”text” name=”password”> 要在程序中取得这个文本输入域的值,只能用这样的方法:request.getParameter(“password”);这样的处理方法在表单比较小的时候是可以使用的,但是当表单输入项较多的时候就不得不大量重复类似上面的处理。
问题的解决
在Struts中就是使用ActionForm来解决这个问题,对于每一个用户的表单,需要提供一个ActionForm,这个ActionForm自动把客户提交的表单保存在这个ActionForm中,然后把这个ActionForm传递给Action,从而在Action中可以通过这个ActionForm取出用户信息,然后根据这些信息完成对应的业务逻辑处理。
例如在Struts中用struts的html标签表述成下述形式:

<html:text property=”password”/>

在这种情况下表单提交后,struts框架会自动把表单中的这个输入项赋值到ActionForm中的password属性中,从而把表单中的内容保存在ActionForm中,整个过程由struts自动完成,不需要开发人员干涉。我们在创建ActionForm时要遵循以下规范:
(1)每个ActionForm都要继承org.apache.struts.action.ActionForm类,而且需要为每一个表单提供一个ActionForm。
(2)ActionForm中每个属性要与表单中的输入项一一对应。
(3)AcitonForm每个属性都要提供的getter方法和setter方法。Struts框架就是通过这些方法来保存表单的值,然后在Action中通过这些方法取得表单的值。
(4)如果表单需要验证,就需要在ActionForm中提供validate方法,这个方法中提供对表单的具体验证逻辑。这个方法不仅实现了数据验证同时实现了数据缓冲的作用,在validate方法中验证用户提交表单的有效性,当表单验证失败时会自动返回用户输入页面,这时候用户输入的值都保存在ActionForm中,返回页面时struts框架会取出AcitonForm中的数据并输出到对应的用户输入项中,保证了用户开始输入的表单信息。

问题的提出
以上所说的是静态ActionForm,当我们为每个表单都创建一个AcitonForm的时候,会导致ActionForm数量过多。每个ActionForm过强的聚合性也会使代码难以维护和重用。怎么样不用去创建过多的ActionForm?而且当提交表单的属性名字相同时,不用再重复创建AcitonForm(例如登录和注册)?
问题的解决
Struts中可以使用动态ActionForm来解决上述问题。动态ActionForm不需要创建自己的ActionForm,需要在创建自己Action的时候直接把execute方法中传递过来的form对象转化为DynaActionForm。
我们需要更改struts-config.xml中form-beans配置:

<form-beans>
      <form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
         <form-property name="username" type="java.lang.String" />
         <form-property name="age" type="java.lang.Integer"/>
      </form-bean>
  </form-beans>

Action中使用get方法取得表单中的值。

/**
 * 测试动态ActionForm.
 * @author summer
 *
 */
public classDynaActionFormTestAction extends Action { 

  @Override
  publicActionForward execute(ActionMapping mapping, ActionForm form,
         HttpServletRequestrequest, HttpServletResponse response)
         throwsException { 

      DynaActionFormdaf = (DynaActionForm)form; 

      //取出map中key值为name,value为类名.
      Stringusername = (String)daf.get("username");
      Integerage = (Integer)daf.get("age"); 

      System.out.println("username"+username);
      System.out.println("username"+age); 

      returnmapping.findForward("success");
  } 

}

静态ActionForm方式,使用get/set方法,而动态ActionForm方式,使用map的getkey方式,其中key就是标签name的值。
使用动态ActionForm优点:若更改表单和ActionForm时不需要重新编译,而静态的需要更改静态的ActionForm.java文件,必须重新编译。缺点:静态返回的是对应的值,动态ActionForm返回的是对象,我们还要把这个对象进行强制转换。

(0)

相关推荐

  • App登陆java后台处理和用户权限验证

    最近做一个app项目,后台我独自一人开发,开发任务顺序安排上没有把登陆,注册和权限验证这些基本功能放在第一阶段开发,现在是部分业务相关功能已经完成,但是用户入口竟然还没有,只能说明当初需求分析的时候还是太过于着急了,把最基本的用户入口给放到后面了. 现在就需要在现有代码的基础上添加用户登录和权限验证功能. 关于登录和权限验证方面,参照以前做iOS的开发经验,App端提供用户名和密码换取token,每次通过换取的token请求需要登陆权限的操作. 现在反过来,我就需要考虑下面几个问题: 1.在现有

  • JavaWeb实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)

    JavaWeb实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)的实现思路如下所示: 一.该功能有什么作用 大家想想吧.反正总会有这样的需求的.这年头什么需求不会有..呵呵.有时候也不一定是需求,很有可能为了安全也会这么做.例如考试系统,在线聊天系统,很有必要做成这样的吧. 二.实现过程 a.问题分析 在系统中,我们一般都是把登录信息绑定到session中,看来从这入手是可能找到解决办法.说白了,也就是当用户登录时,判断一下这个用户有没有登录,如果登录了,就把以前的那个session清除

  • SpringMVC实现账号只能在一处登陆

    一.问题引导 在Web开发中,实现一个账号只能在一处登陆有两种形式:1.当某个账号在某处登陆后,如果再在其他处登陆,将前一个账号挤掉:2.当某个账号登陆后,此账号在其他设备登陆提示已经登陆,无法登陆. 正常的应用逻辑第一种应用较为广泛,因此此篇文章讨论一下第一种逻辑在spring mvc开发中一种较为简单的实现方式. 然而在没有长连接如WebSocket或者异步请求轮询的情况下,我们之前登陆的账号只能在下一次请求(同步或异步)才能获取被挤掉的状态(如页面跳转). 二.实现步骤 1.建立一个静态M

  • java模拟cookie登陆操作

    在使用java访问URL时,如果该URL需要身份验证,那么就不能够直接访问,因为没有登陆.那么,如何解决这个问题呢? 方法是使用java模拟登陆,登陆后记录下cookie信息,在下次发起请求时时将cookie发送过去用以表明身份,这样就能够访问带有权限的URL了. 下面首先介绍使用java模拟登陆. // 连接地址(通过阅读html源代码获得,即为登陆表单提交的URL) String surl = "http://login.goodjobs.cn/index.php/action/UserLo

  • Java的Struts框架中登陆功能的实现和表单处理器的使用

    实现Struts登录 1.jar包拷贝 首先是建立java web项目,之后打开我们我们下载好strtus框架,Struts-1.2.9-bin文件夹和struts-1.2.9.src源文件文件夹.在bin文件夹中的lib文件中拷贝struts的jar包,拷贝到我们自己项目struts_login –>lib文件夹下. 2.web.xml文件配置 找到Struts-1.2.9-bin中Struts-1.2.9-bin-->webapps下的struts实例struts-blank中的strut

  • Java下Struts框架中的ActionForm类详解

    ActionForm的应用 (1) .创建一个form类必须继承四个父类中的一个.比如继承ActionForm. (2) .一个form类中的每一个属性都将和页面中form 表单中的每一个元素一一对应 例如. 一个表单为: <form> <input type="text" name="username"></input> <input type="password" name="passwor

  • 在Java的Struts框架中ONGL表达式的基础使用入门

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能. 此外,还得先需弄懂OGNL的一些知识: 1.OGNL表达式的计算是围绕OGNL上下文进行的. OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示.它里面可以存放很多个JavaBean对象.

  • 详解Java的Struts框架中栈值和OGNL的使用

    值栈: 值栈是一个集合中的几个对象保持下列对象提供的顺序: 值栈可以通过JSP,Velocity或者Freemarker的标签.有各种不同的标签在单独的章节中,我们将学习,用于获取和设置Struts 2.0 的值栈. ValueStack的对象里面可以得到动作如下: ActionContext.getContext().getValueStack() 一旦拥有了值对象,就可以用下面的方法来操纵该对象: OGNL: 对象图形导航语言(OGNL)是一个功能强大的表达式语言是用来参考值栈上的数据和操纵

  • Java的Struts框架中<results>标签的使用方法

    <results>标签在Struts2的MVC框架的视图中所扮演的角色.动作是负责执行业务逻辑.执行业务逻辑后,接下来的步骤是使用<results>标签显示的视图. 经常有一些附带导航规则的结果.例如,如果在操作方法是对用户进行验证,有三种可能的结果. (一)成功登录:(二)不成功的登录,用户名或密码错误:(三)帐户锁定. 在这种情况下的动作方法将被配置呈现的结果有三种可能的结果字符串和三个不同的看法.我们已经看到在前面的例子. 但是,Struts2 不配合使用JSP作为视图技术.

  • Java的Struts框架中的主题模板和国际化设置

    主题模板 如果不指定一个主题,然后Struts2中会使用默认的XHTML主题.例如Struts 2中选择标签: <s:textfield name="name" label="Name" /> 生成HTML标记: <tr> <td class="tdLabel"> <label for="empinfo_name" class="label">Name:<

  • 简单说明Java的Struts框架中merge标签的使用方法

    merge标签合并标记需要两个或两个以上的列表作为参数,并把它们合并在一起,如下所示: <s:merge var="myMergedIterator"> <s:param value="%{myList1}" /> <s:param value="%{myList2}" /> <s:param value="%{myList3}" /> </s:merge> <

  • 深入解析Java的Struts框架中的控制器DispatchAction

    Struts中的表单处理器为ActionForm,而struts中的控制器主要是Action,以及DispatchAction控制器等. Action 在struts中,所有的用户都会经过ActionServlet的处理,而实际的工作是交给Action对象来处理的,ActionServlet可以从配置文件中创建ActionMapping对象,从ActionMapping对象中找到对应使用的Action,然后将用户请求转交给Action. 对Struts一个ActionMapping只能生成一个A

  • Java的Struts框架中append标签与generator标签的使用

    append 标签: 这些append标签需要两个或两个以上的列表作为参数,并追加它们放在一起,如下图所示: <s:append var="myAppendIterator"> <s:param value="%{myList1}" /> <s:param value="%{myList2}" /> <s:param value="%{myList3}" /> </s:ap

  • Java的Struts框架中Action的编写与拦截器的使用方法

    Struts2 Action/动作 动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架.每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑. 但动作也提供其他两个重要的能力.首先,操作从请求数据的传输中起着重要的作用,通过向视图,无论是一个JSP或其它类型的结果.二,动作必须协助的框架,在确定结果应该渲染视图,在响应该请求将被退回. 创建动作: 在Struts2的动作,唯一的要求是必须有一个无参数的方法返回String或结果的对象

随机推荐