zoukankan      html  css  js  c++  java
  • 使用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=u7528u6237u540Du4E0Du80FDu4E3Au7A7AuFF01
    2 password.null=u5BC6u7801u4E0Du80FDu4E3Au7A7AuFF01

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

    在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>
  • 相关阅读:
    超详细的 Vagrant 上手指南
    简单聊聊 Ironic
    什么是裸金属
    使用 minikube 快速上手 Kubernetes | v1.7.3
    来看看你对Python变量理解到位了没有
    python HelloWorld 的 4 种姿势,你知道几种
    Windows 系统安装 Python 3.8 详解
    myeclipse2017下载安装与破解详细教程
    eclipse中tomcat的add and Remove找不到项目
    cmd中查看MySQL数据库表数据及结构
  • 原文地址:https://www.cnblogs.com/wukong65/p/3413396.html
Copyright © 2011-2022 走看看