前言:本篇文章是本人这周学习的一个小结,在自我总结的同时,希望也能够给其他同学带来一点帮助。本文主要知识是参照书本上的知识点以及网上其他博客文章,在上机操练后的所得,具体源码主要来自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框架,实现用户登陆功能的具体步骤,写了两个小时终于把本文写完了~

使用Struts框架,实现用户登陆功能的更多相关文章

  1. 刚開始学习的人非常有用:纯struts框架实现用户登陆

    本人新手一枚.也在学习ssh.高手建议从struts2開始学起,所以我就先仅仅用struts2写了一个demo.能够有助于理解struts2在项目中的作用. 首先简单了解一下struts2 的MVC模 ...

  2. JavaWeb_(Struts2框架)使用Struts框架实现用户的登陆

    JavaWeb_(Struts2框架)使用Servlet实现用户的登陆 传送门 JavaWeb_(Struts2框架)Servlet与Struts区别 传送门 MySQL数据库中存在Gary用户,密码 ...

  3. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

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

  4. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整

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

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

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

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

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

  7. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能

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

  8. 用java实现一个简单的单用户登陆功能的思路

    引用 所谓“单用户单账户登录”是指:在同一系统中,一个用户名不能在两个地方同时登录. 我们参照 QQ 实现效果:当某账号在 A 处登录后,在未退出的情况下,如果再到 B 处登录,那么,系统会挤下 A ...

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

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

随机推荐

  1. Visual Studio 2013 Update 3 RTM 正式发布

    VS2013.3 RTM已发布! 完整安装包:http://download.microsoft.com/download/6/F/0/6F0777D3-3541-465F-8639-A8F9D36B ...

  2. 【手记】F5调试报"由于缺少调试目标xxx无法开始调试xxx设置OutputPath和AssemblyName"

    问题如图: 如果先点[生成]项目,再按F5调试就不会报错,但稍后修改代码后再次调试,会发现VS启动的是代码修改前的程序,也就是说,深一层的问题其实是调试时不会先生成,而是直接打开debug/relea ...

  3. CSS画猪

    效果查看:http://hovertree.com/texiao/css3/6/ CSS3画猪头: http://hovertree.com/texiao/css3/6/1/ 代码如下: <!D ...

  4. 设置Textview最大长度,超出显示省略号

    <TextView android:id="@+id/tvUserNameUgcListItem" android:layout_height="@dimen/dp ...

  5. for xml path 将单表中一个字段用逗号分隔

    我也是才知道这种用法的,刚好又用到写个简单的例子. select Name from tc_order_detail 如下表,现在要将做到将name每个以逗号连接 declare @df nvarch ...

  6. JavaScript进阶之this

    javascript的this,一个不知道究竟属于谁的东西 this是一个大利器,用好了就可以帮我们省掉很多事,然而事实上却总是让我们出错.自己就吃过很大的亏.现在咱们就来扒一扒this究竟是什么. ...

  7. Android Studio :enable vt-x in your bios security,已经打开还是报错的解决方法

    quote: For Windows 10: First of all, install the intelhaxm-android.exe located in the folder SDK\ext ...

  8. Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制

    回到目录 Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构 ...

  9. [注意]SerialPort操作PCI-1621D多串口卡,出现异常"参数不正确"

    开发LED大屏显示.40-20mA模拟量输出的时候,经常要与串口打交道.但是Windows自带的SerialPort串口操作组件貌似兼容性 不是太好,或是SerialPort本身有BUG,在操作PCI ...

  10. H5中的touch事件

    touch中共有touchstart.touchmove和touchend三个事件: touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结 ...