struts 2中带有验证的登录页

时间:2020-02-23 14:36:03  来源:igfitidea点击:

在本例中,我们将看到如何使用Struts2验证登录页。

在上一篇文章中,我们学习了如何从客户机请求映射到操作类,以及如何在操作类的execute()方法返回的字符串的基础上呈现适当的jsp。

在本教程中,我们将使用struts ui标记来创建登录页面,因此我们将学习如何使用标记。
创建名为"LoginAppInStruts2"的项目。

web.xml:

在文件夹WebContent/Web-Inf下创建Web.xml文件。

在web.xml中复制以下内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
 <display-name>LoginAppInStruts2</display-name>
 <filter> 
     <filter-name>
        struts2
     </filter-name>
     <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
     </filter-class>
 </filter>
 
 <filter-mapping>
     <filter-name>struts2</filter-name>
     <url-pattern>/*</url-pattern> 
 </filter-mapping>
 
 <welcome-file-list>
     <welcome-file>login.jsp</welcome-file>
 </welcome-file-list>
</web-app>

JSP:

login.jsp:

在WebContent下创建登录页面作为login.jsp。

将以下内容复制到login.jsp中

&<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
 pageEncoding="ISO-8859-1"%>
 
 <%@taglib uri="/struts-tags" prefix="s" %> 
 
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login Page</title>
 
<s:head 
 </head>
<body bgColor="lightBlue">
<s:form action="Login">
 <s:textfield name="userName" label="User Name" 
 <s:password name="password" label="Password" 
 <s:submit value="Login" 
</s:form>
 
</body>
</html>

<%@ taglib uri ="/struts-tags"prefix ="s"%>是JSP中使用的指令,包括Struts标签文件。

标签应放在HTML页面的头部部分。
S:Head标记会自动生成与渲染表单元素所需CSS和JavaScript库的链接。

S:表单标记包含所有表单元素。
操作属性包含要提交表单的操作名称。
此操作名称应与XML声明架构中指定的名称相同。
在此示例中,我们使用Struts.xml文件进行配置。

使用TextField标记创建文本框。
TextField标记的Label属性包含页面上的名称,名称属性包含要映射的操作类中的属性的名称。
密码标记与TextField标记相同,除了屏蔽输入值之外。
提交标记用于创建提交按钮,值"登录"表示按钮的标签。

请注意,如果代码很简单,没有任何HTML表,这是因为Struts 2将根据所选主题自动为页面创建必要的表。
默认情况下,选择了XHTML主题。

当用户单击"登录"按钮时,请求转发到登录操作。

欢迎.JSP:

在WebContent下创建欢迎.JSP。

将以下内容复制到欢迎.JSP中

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>login Successful</title>
</head>
<body>
Welcome <s:property value="userName"!!!
</body>
</html>

行动类:

我们的Logination类扩展了ActionSupport。
扩展ActionSupport类很好,因为它为大多数常见任务提供默认实现。

在SRC下创建LoginAction.java

将以下代码复制到LoginAction.java中

package org.igi.javapostsForLearning;
import com.opensymphony.xwork2.ActionSupport;
 
public class LoginAction extends ActionSupport {
 
    private String userName;
    private String password;
 
    public String execute() {
        return SUCCESS;
    }
 
   
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
    public void validate() {
        if (getUserName().length() == 0) {
            addFieldError("userName", "UserName.required");
        } else if (!getUserName().equals("igi")) {
            addFieldError("userName", "Invalid User");
        }
        if (getPassword().length() == 0) {
            addFieldError("password", getText("password.required"));
        }
    }
}

ActionSupport类实现了公开execute()方法的操作接口。
以下常量在动作接口中声明,可以用作Execute()方法中的返回值。

public static final String ERROR = “error"

public static final String INPUT = “input"
public static final String LOGIN = “login"
public static final String NONE = “none"
public static final String SUCCESS = “success"

操作执行失败时返回错误。
当操作需要来自用户的更多输入时,将返回输入。
当用户未登录到系统时,将返回LOGIN。
当操作执行成功并且没有要显示的视图时,将返回NONE。
当操作成功执行并且相应的结果显示给user.Now 在我们的动作类中,我们有两个属性:

私有字符串 userName;它应该与TextField的名称相同,用于将用户名作为Login.jsp中定义的输入。
私有字符串 password; - 它应该与文本字段的名称相同,用于将密码作为登录中定义的输入.jsp

tag -您可以注意到我们使用了Struts标记。它呈现动作类的属性值。在本例中,属性是的用户名loginAction.java. 所以无论用户在userName textfield中输入什么,都会出现在Welcome.jsp.

struts.xml:

在src.struts.xml中创建Struts.xml在URL之间映射到操作映射。

将以下代码复制到Struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="LoginAction" 
    <package name="default" extends="struts-default" namespace="/">
        <action name="Login" class="org.igi.javapostsForLearning.LoginAction" >
            <result name="success">Welcome.jsp</result>
            <result name="input">login.jsp</result>
        </action>
    </package>
</struts>

其中我们的"默认"包扩展了"Struts-Default"包。
通过扩展"Struts-default"包,默认将默认继承操作将继承DefaultStack中定义的拦截器集。
"Struts-default"包在Struts-default.xml文件中定义。

操作所做的所有常见任务都是分开的并放置在不同的拦截器中。
我们可以为每个操作定义拦截器堆栈。
大多数常用的拦截器都在Struts-默认包的DefaultStack中分组。
在大多数情况下,DefaultStack就足够了。
在执行操作之前和之后,禁区将以其在堆栈中声明的顺序进行触发。

<interceptor-stack name="defaultStack">
     <interceptor-ref name="exception"
     <interceptor-ref name="alias"
     <interceptor-ref name="servletConfig"
     <interceptor-ref name="prepare"
     <interceptor-ref name="i18n"
     <interceptor-ref name="chain"
     <interceptor-ref name="debugging"
     <interceptor-ref name="profiling"
     <interceptor-ref name="scopedModelDriven"
     <interceptor-ref name="modelDriven"
     <interceptor-ref name="fileUpload"
     <interceptor-ref name="checkbox"
     <interceptor-ref name="staticParams"
     <interceptor-ref name="actionMappingParams"
     <interceptor-ref name="params">
     <param name="excludeParams">dojo\..*,^struts\..*</param>
     </interceptor-ref>
     <interceptor-ref name="conversionError"
     <interceptor-ref name="validation">
     <param name="excludeMethods">input,back,cancel,browse</param>
     </interceptor-ref>
     <interceptor-ref name="workflow">
     <param name="excludeMethods">input,back,cancel,browse</param>
     </interceptor-ref>
 </interceptor-stack>

现在让我们看看不同的拦截器播放的角色。

Params拦截器有助于将请求数据传送到Action对象。

工作流拦截器控制COTROL的流量。

工作流拦截器检查操作是否实现了可验证的接口,如果它确实,工作流拦截器将调用动作类的validate()方法。

在validate()方法中,我们验证用户名和密码。
如果验证失败,则使用addfielderror()方法添加错误。

validate()方法没有返回任何错误,而是在ValidationAware接口的帮助下存储所有错误。

现在工作流拦截器将检查发生任何验证错误。
如果发生任何错误,则工作流拦截器将停止请求处理并将控件传输到输入页面,使用适当的错误消息。

ResourceBundle:

ResourceBundle是非常有用的Java实体,有助于将静态内容从源文件中放置。
大多数应用程序定义了资源包文件,例如ApplicationResources.properties文件,其中包含静态邮件,例如用户名或者密码,并将其与应用程序一起包含。

属性文件应具有与操作类相同的名称。
在我们的情况下,属性文件名为"LoginAction.properties",操作名称是"LoginAction.java"。
当编译源时,此属性文件应在Web-Inf/Classes文件夹中存在。

在src .copy下创建logination.properties。
内容以logination.properties。

userName.required=user name is required
password.required=password is required

运行项目:

右键单击项目 - >在服务器上运行 - >运行

因此,当我们粘贴结果URL(https://localhost:8080/loginappinstruts2 /)到浏览器时,我们将获得一些这样的东西。