使用Struts框架,实现用户登陆功能

前言:本篇文章是本人这周学习的一个小结,在自我总结的同时,希望也能够给其他同学带来一点帮助。本文主要知识是参照书本上的知识点以及网上其他博客文章,在上机操练后的所得,具体源码主要来自http://blog.csdn.net/lovesummerforever/article/details/17348871。

本文主要包括以下三点:MVC设计模式基本概念、Struts工作原理、使用Struts框架实现用户登陆具体实例操作。

一、        MVC设计模式

在了解MVC模式之前,先要弄清楚什么是设计模式。

设计模式是一套被反复使用、多数人知晓的、代码设计经验的总结,模式必须是典型问题的解决方案。设计模式的作用是解决一类问题的成功经验,是为了可重用代码、让代码更容易被他人理解、保证代码的可靠性。

MVC是一种流行的软件设计模式,这种模式将应用程序实现分为模型(Model)、视图(View)和控制器(Controller)三个部分,主要特点是把显示和数据分离,增加了软件的可重用性。MVC设计模式具体如图一:

图一:MVC设计模式

1、  模型(Model)

模型表示数据和业务处理,它可以分为数据模型和业务模型,分别代表应用程序的状态和业务逻辑。模型对应的组件是JavaBean或者Java类,只需写一次就可以被多个视图重用,减少了代码的重复性。用一句话来说:模型就是实现系统中的具体功能模块。

2、  视图(View)

视图是用户看到的与之交互的界面,负责数据采集和处理用户的请求。视图只是作为一种输出数据并允许用户操纵的方式,对应的组件是JSP或HTML文件。

3、  控制器(Controller)

控制器是接受用户端的请求,将模型和视图联系在一起,实现用户请求的功能。对应的组件是Servlet,起承上启下的枢纽作用。

二、        Struts工作原理

Struts是第一个按照MVC设计模式搭建的Web开发框架,基于Struts开发的应用由三类组件构成:控制器组件、模型组件和视图组件。具体模型如图二:

图二:Struts结构图

1、  控制器组件

控制器组件包括ActionServlet(核心控制器)和自定义的Action(代表一个用户的操作)。ActionServlet的只要功能是将一个客户端的请求映射到相应的Action,如果该Action配置了指定的ActionForm,那么就在request中抓取数据填充到这个ActionForm,然后调用Action的execute方法。在execute方法执行完成后,ActionServlet将接受包括有下一个资源信息的ActionFoward对象,并将请求转至下一个资源。

2、  视图组件

视图组件包括JSP页面、ActionForm和Struts标签。视图组件一般由JSP实现,还包括自定义的ActionForm类和Struts标签。自定义的ActionForm类用于封装页面提交的数据,且ActionForm类需要在struts-config.xml中配置,从页面获得输入属性与表单域name属性值一致。

3、  模型组件

模型组件包括定义和实现业务逻辑的接口和类。模型组件并不由Struts提供,由普通的接口和JavaBean充当,需要用户自己编码实现。例如,用户登陆时获取用户名和密码并与数据库中数值比较的接口等。

三、        使用Struts框架实现用户登陆具体实例操作

1、 创建Web项目,添加Struts到项目

首先创建一个Web项目,输入项目名Struts_Login后,选择MyEclipse工具中的MyEclipse菜单中的Project Capabilities->Add Struts Capabilities命令,具体如图三:

图三:添加Struts框架Jar包到项目

在添加完Struts框架jar包文件后,系统为自动产生struts-config.xml文件,并在web.xml中自动添加ActionServlet。

2、  实现登陆功能的ActionForm类和Action类编写

ActionForm主要用来封装页面输入的表单信息,本例中只设置了用户名和密码两个信息,具体类名是LoginActionForm。代码如下:

package com.liu.struts;import org.apache.struts.action.ActionForm;public class LoginActionForm extends ActionForm {/*** */private static final long serialVersionUID = 1L;//用户名。  private String username;  //密码。  private String password;  //设置密码。  public void setPassword(String password) {  this.password = password;  }  //得到用户名。  public String getUsername() {  return username;  }  //设置用户名。  public void setUsername(String username) {  this.username = username;  }  //得到密码。  public String getPassword() {  return password;  }  }

Action类主要是用来实现具体用户操作的功能,本例中LoginAction类继承Action,表示用户的登陆操作。具体代码如下:

package com.liu.struts;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;public class LoginAction extends Action{public ActionForward execute(ActionMapping mapping,ActionForm form,  HttpServletRequest request, HttpServletResponse response)  throws Exception {  LoginActionForm laf = (LoginActionForm)form;  String username = laf.getUsername();  String password = laf.getPassword();  UserManager userManager = new UserManager();  //传递用户名和密码  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");  }
}

3、  处理用户登陆的业务逻辑层userManager类的书写

本例中用户登陆成功的用户名和密码均为admin,是直接写在.java文件中的信息,没有与数据库中信息进行验证交互,但弄清楚本例后,自己再去进行数据库中信息验证,具体步骤操作也是大同小异。

userManager类具体源码如下:

package com.liu.struts;public class UserManager {public void login(String username,String password)  {  if(!"admin".equals(username))  {  throw new UserNotFoundException();  }  if(!"admin".equals(password))  {  throw new PasswordErrorException();  }  }
}

UserNotFoundException具体代码如下:

package com.liu.struts;public class UserNotFoundException extends RuntimeException {/*** */private static final long serialVersionUID = 1L;public UserNotFoundException() {  }  public UserNotFoundException(String message) {  super(message);  }  public UserNotFoundException(Throwable cause) {  super(cause);  }  public UserNotFoundException(String message,Throwable cause) {  super(message, cause);  }
}

PasswordErrorException具体代码如下:

package com.liu.struts;public class PasswordErrorException extends RuntimeException {/*** */private static final long serialVersionUID = 1L;public PasswordErrorException() {  }  public PasswordErrorException(String message) {  super(message);  }  public PasswordErrorException(Throwable cause) {  super(cause);  }  public PasswordErrorException(String message,Throwable cause) {  super(message, cause);  }
}

以上便是业务逻辑层处理用户登陆的具体代码。

 

4、 配置sturts-config文件

具体Struts-config代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config><form-beans>  <form-bean name="loginForm" type="com.liu.struts.LoginActionForm"/>  </form-beans><global-exceptions /><global-forwards /><action-mappings>  <action path="/login"  type="com.liu.struts.LoginAction"  name="loginForm"  scope="request"  >  <forward name="success" path="/Login_success.jsp"/>  <forward name="error" path="/Login_error.jsp"/>  </action>  </action-mappings>    <message-resources parameter="com.yourcompany.struts.ApplicationResources" />
</struts-config>

与是相关的Web.xml代码如下(此处用的系统自动导入Struts的jar包文件,所以web.xml不需要配置,不过可以参考看一下):

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><display-name /><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>3</param-value></init-param><init-param><param-name>detail</param-name><param-value>3</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

6、 编写视图层JSP文件

index.jsp源码如下(此JSP文件为登陆界面):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form action="login.do" method="post">  用户:<input type="text" name="username"><br>  密码:<input type="password" name="password"><br>  <input type="submit" value="登录">
</form>  </body>
</html>

当用户密码或用户名输入错误时,跳转到Login_error.jsp界面,具体源码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'Login_error.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%--  <%=request.getAttribute("msg") %>  --%>  ${msg },登陆错误!!!  </body>
</html>

当用输入用户名和密码均正确时,跳转到Login_success.jsp界面,具体源码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'Login_success.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>${username},登录成功! </body>
</html>

附:下图四是项目Struts_Login目录结构,如下:

图四:Struts_Login项目目录结构

6、部署、运行项目

     首先开启Tomcat服务,然后给Struts_Login项目配置具体Tomcat,完成这两步后,在浏览器中输入http://localhost:8080/Struts_Login即可得到预期目标。具体步骤截图及运行截图如下:

图五:打开Tomcat服务

图六:给Struts_Login配置Tomcat

图七:登陆界面

图八:登陆成功界面

图九:登陆失败界面

好了,以上就是使用Struts框架,实现用户登陆功能的具体步骤,写了两个小时终于把本文写完了~

每天一小步,成就一大步

最新随笔

  • 1. 一次排查服务器端接口报500错误的经历
  • 2. 基于Python使用Redis的一些想法和建议
  • 3. 基于Python的datetime模块和time模块源码阅读分析
  • 4. 使用AOF持久化文件实现还原Redis数据库并得到RDB持久化文件
  • 5. 基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)
  • 6. Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示
  • 7. Git操作简单入门及相关命令
  • 8. Ubuntu16.04下安装搭配Python3.6相关配置软件方法
  • 9. 基于Python3.6使用Django框架连接mysql数据库的驱动模块安装解决办法
  • 10. Ubuntu16.04上使用Anaconda3的Python3.6的pip安装UWSGI报错解决办法

阅读排行榜

  • 1. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)(15660)
  • 2. 使用Servlet和JSP实现一个简单的Web聊天室系统(14260)
  • 3. Python2.7.14安装和pip配置安装及虚拟环境搭建(9469)
  • 4. Tomcat服务无法开启,点击start不一会就变成stopped(9003)
  • 5. 关于mysql数据库插入数据,不能插入中文和出现中文乱码问题(6367)

评论排行榜

  • 1. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)(11)
  • 2. 使用MongoDB和JSP实现一个简单的购物车系统(10)
  • 3. 使用Servlet和JSP实现一个简单的Web聊天室系统(7)
  • 4. 第八届蓝桥杯个人赛赛后总结(5)
  • 5. 算法笔记_172:历届试题 波动数列(Java)(5)

推荐排行榜

  • 1. 使用MongoDB和JSP实现一个简单的购物车系统(7)
  • 2. 第八届蓝桥杯个人赛赛后总结(7)
  • 3. 蓝桥杯软件类个人赛历届真题汇总(资料整理)(6)
  • 4. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)(5)
  • 5. 使用Flask+MongoDB实现基于REST的接口简单操作(4)

Copyright ©2018 舞动的心

使用Struts框架,实现用户登陆功能相关推荐

  1. python编程用户登陆c_django实现用户登陆功能详解

    简介: Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架,由Python ...

  2. 需求说明 用户登陆功能的实现 c#

    需求说明 用户登陆功能的实现 c# 需求说明 新建一个用户数据表 添加一个管理员的用户 编写一个c#的程序 接收用户输入的帐号与密码 提交后查询数据库 如果查询成功 提示登陆成功 否则提示登陆不成功 ...

  3. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)--创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)--使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  4. session实现用户登陆功能

    <link href="https://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON"> &l ...

  5. struts2+Hibernate实现用户登陆功能

    实现的功能,在登陆页面输入Username和PassWord后,将username和password通过Hibernate匹对数据库是否含有一样的username和password,若有则登陆进去,若 ...

  6. 基于springmvc+mysql+mybatis实现用户登陆功能

    最近在学习springmvc框架,每天的学习过程中颇有一些收获,打算写一篇博客记录一下,也希望能帮到同样在学这个的人. 一:Springmvc 1:SpringMVC的组成结构: (1)前端控制器(D ...

  7. 自动化测试(二)如何用python写一个用户登陆功能

    需求信息: 写一个判断登录的程序: 输入: username password 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 需要判断输入是否为空,什么也不输入,输入一个空格.n个 ...

  8. 实现登陆功能——用户登录设计

    1.用户表字段: 用户ID 用户密码 用户名 salt 头像 注册时间 上次登陆时间 登陆次数 id password nickname salt head register_date last_lo ...

  9. struts框架学习过程中的问题。

    1,错误: java.lang.NullPointerException: Module 'null' not found. 错误原因,struts运行需要的.jar文件拷贝不足,应该把它们加入到cl ...

  10. 第六天 黑马十次方 用户注册、用户登陆掌握js-cookie、微信扫码登陆、nuxt嵌套路由

    学习目标: ** 完成用户注册功能 完成用户登陆功能,掌握js-cookie的使用 完成微信扫码登陆的功能 完成用户中心嵌套布局,掌握nuxt嵌套路由的使用 ** 1 用户注册 1.1 页面构建 创建 ...

最新文章

  1. Requests方法 -- 关联用例执行
  2. 在centos6.4 编译64位的hadoop 2.4.1
  3. 真正的程序员,从来不会告诉你这些事!
  4. nyoj-673-悟空的难题(数组标记)
  5. 最佳String判断是否为空
  6. 待更新内容mongodb
  7. 内部收益率irr_爱心人寿心相随年金险,IRR内部收益率测算
  8. 计算机组成原理学习-哈工大《计算机组成原理》第二章
  9. CoreUI: RunTimeThemeRefForBundleIdentifierAndName() couldn't find Assets.car in bundle...
  10. matlab 空间向量的夹角,空间两向量之间的旋转角如何求?角度范围在0-360°
  11. CAD 关于打断和合并对象
  12. 蓝牙连接手表后微信语音来电不响铃
  13. 一文彻底解决An error occurred while creating the AVD. See idea.log for details问题
  14. html页面字体飞入飞出特效,JS网页特效:星空飞入效果
  15. visual stadio code(VS code) 中 Markdown简明操作[持续更新]
  16. 新手进阶建模 (写论文摘要和看论文)
  17. amd插帧技术如何开启_不要浪费那块屏幕,联想小新13 Pro AMD锐龙标压版视频插帧设置...
  18. LM393比较器仿真
  19. 小学老师工资多少一个月_教师一个月工资是多少? 全国各地教师工资一览
  20. WINSYS DAY01:一步一步教你win10是如何远程win server2016 全过程。

热门文章

  1. 微信小程序模版合集下载,160个微信小程序源码.zip + 35个行业-微信小程序源码.zip
  2. 120多套各种类别微信小程序模板源码
  3. python制作小游戏大全_python制作小游戏(一)
  4. hex2bin() 函数
  5. Java Jar 包反编译
  6. 在线考试系统设计+源码
  7. 汉诺塔c 语言程序代码,汉诺塔c语言程序代码.doc
  8. USB接口ID卡读卡器oem软件(vb源代码)
  9. 计算机网络技术基础知识
  10. python爬取音乐源码_Python爬虫教程,爬取网易云的音乐