java struts 介绍_Struts简介、原理及简单实现-程序员宅基地

技术标签: java struts 介绍  

struts简介

Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用JavaServlet/JSP技术,实现了基于JavaEEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。

Struts发展历史

Struts是作为ApacheJakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServerPages、servlet、标签库以及面向对象的技术水准。

Struts这个名字的来源于在建筑和旧式飞机中使用的支持金属架。之所以这个框架叫做“struts”,是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷的基础支撑。这也是解释struts在开发web应用程序中所扮演的角色的精彩描述。

Struts的含义是”支柱,枝干”,它的目的是为了减少程序开发的时间,项目的创建者认为JSP,servlet的存在虽然可以帮助用户解决大部分问题,但是由于它们的编码对项目的开发带来了许多的不方便,可重用性也差,所以struts应运而生,帮助用户在最短的时间内解决这些问题。Struts框架提供如下服务:

(1)作为控制器的Servlet。

(2)提供大量的标签库。

(3)提供了用于国际化的框架,利用不同的配置文件,可以帮助用户选择合适自己的语言。

(4)提供了JDBC的实现,来定义数据源和数据库连接池。

(5)XML语法分析工具。

(6)文件下载机制。

Struts原理

Struts是对JSPModel2设计标准的一种实现,下面分别从模型(Model)、视图(view)和控制器3个部分介绍Struts的体系结构和工作原理。调用流程如下所示(图1.1)。

1a6e314bc586727040103dbe34142f02.png

图1.1

(1)视图(view)

在Struts中,视图层包含两个部分,JSP页面和ActionForm。

ActionForm封装了用户提交的表单信息,其实ActonForm本质上就是JavaBean,这些JavaBean中没有业务逻辑,只提供了所有属性的getter和setter方法,这些属性和用户表单中的输入项是一一对应的。在Struts中就是通过ActionForm把用户表单信息提交给控制器。

JSP页面是经典MVC中主要的视图组件,主要是信息显示和控制器处理结果显示的功能。

除了以上,struts还提供了一个强大的struts标签库,来帮助用户解决显示逻辑,并且利用ActonForm组件将信息传递到控制层。

(2)控制器(Controller)

在控制层,struts提供了一个控制器组件ActionServlet,它继承自HttpServlet,并重载了HttpServlet的doGet(),doPost()方法,可以接受HTTP的响应,并进行转发,同时还提供了使用XML进行转发Mapping(映射)的功能。

(3)模型(Model)

模型表示状态和业务逻辑的处理,在一般的web应用程序中,用JavaBean或者EJB来实现系统的业务逻辑。在Struts中,struts提供Action对象,来管理业务逻辑的调用,帮助用户分离业务逻辑,也就是说struts本身不实现业务逻辑,但可以调用已完成的业务逻辑。

Struts工作流程

Struts工作流程如下(图1.2)所示。

87b7a89558062fadfbc44828d3d40302.png

图1.2

ActionServlet是struts中核心的控制器,所有的用户请求都必须通过ActionServlet的处理,而struts-config.xml是struts中核心的配置文件,在这个文件中配置了用户请求URL和控制器Action的映射关系,ActionServlet通过这个配置文件把用户的请求发送到对应的控制器中。

在struts web应用程序中,当web应用程序启动的时候,就会初始化ActionServlet在初始化ActionServlet的时候会加载struts-config.xml配置文件,在加载成功后会把这些URL和控制器映射关系存放在ActionMapping对象或者其他对象中。当ActionServlet接收到用户请求的时候,就会按照下面的流程对用户请求进行处理。

(1)ActionServlet接收到用户的请求后,会根据请求URL寻找匹配的ActionMapping对象,如果匹配失败,说明用户请求的URL路径信息有误,所以返回请求路径无效的信息,当找到匹配的ActionMapping的时候,进入到下一步。

(2)当ActionServlet找到匹配的ActionMapping对象的时候,会根据ActionMapping中的映射信息判断对应的ActionForm对象是否存在,如果不存在对应的ActionForm对象就创建一个新的ActionForm对应,并把用户提交的表单信息保存到这个ActionForm对象中。

(3)在struts-config.xml中这个配置文件,可以配置表单是否需要验证,如果需要验证,就调用ActionForm中的validate()方法对用户输入的表单进行验证。

(4)如果ActionForm的validate()方法返回了ActionErrors对象,则表明验证失败,ActionServlet把这个页面返回到用户输入的界面,提示用户重新输入。如果方法的返回值为null,就表明验证已经通过,可以进入下一步处理。

(5)ActionServlet可以根据ActionMapping对象查找用户请求转发给哪个控制器Action,如果对应的Action对象不存在,就创建这个对象,并调用这个Action的excute()方法。

(6)业务逻辑控制器Action的execute()方法就会返回一个ActionForward对象,ActionServlet把控制器处理的结果转发到ActionForward对象指定的JSP页面。

(7)ActionForward对象指定的JSP页面根据返回的处理结果,用合适形式把服务器处理的结果展示给用户,到这里为止,一个客户请求的整个过程完毕。

以上初步struts框架进行了介绍,和对原理进行了简单的分析。至于struts是如何实现MVC的,ActionServlet属于Controller部分,Action和ActionForm属于Model层,还是Action属于Controller层,不同的人对struts有不同的理解。接下来真正的运用到实践中,在实践中深刻去体会,原理固然重要,重要的是运用,是能驾驭和使用这个框架。就像学习开车一样,不是一蹴而就的。

下面已登录为例,进行简单的实现。

Struts配置步骤总结如下(如图2.1):

507d2f0c307274c5acce10d652e8d7b6.png

1、  jar包拷贝

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

cb1dd2f5dd4b78c3c0dba763e3a73bc6.png

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进行配置。

action

org.apache.struts.action.ActionServlet

config

/WEB-INF/struts-config.xml

debug

2

detail

2

2

action

*.do

3、在项目中建立自己的ActionForm

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

packagecom.bjpowernode.struts;importorg.apache.struts.action.ActionForm;/*** 登录ActionForm,负责表单收集数据.

* 表单的属性必须和ActionForm中的get和set的属性一致.

*@authorsummer

**/

public class LoginActionForm extendsActionForm {//用户名。

privateString username;//密码。

privateString password;//设置密码。

public voidsetPassword(String password) {this.password =password;

}//得到用户名。

publicString getUsername() {returnusername;

}//设置用户名。

public voidsetUsername(String username) {this.username =username;

}//得到密码。

publicString getPassword() {returnpassword;

}

}

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

*负责取得表单数据,调用业务逻辑,返回转向信息.

*

*@authorsummer

**/

public classLoginAction extends Action {

@OverridepublicActionForward execute(ActionMapping mapping,ActionForm form,

HttpServletRequest request, HttpServletResponse response)throwsException {

LoginActionForm laf=(LoginActionForm)form;

String username=laf.getUsername();

String password=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放到中,Action配置放到中,struts-config.xml配置代码如下所示。

/p>

"-//Apache Software Foundation//DTD Struts Configuration1.2//EN"

"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

>

其中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;public classUserManager {public voidlogin(String username,String password)

{if(!"admin".equals(username))

{throw newUserNotFoundException();

}if(!"admin".equals(password))

{throw newPasswordErrorException();

}

}

}

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

packagecom.bjpowernode.struts;public classUserNotFoundException extends RuntimeException {publicUserNotFoundException() {

}publicUserNotFoundException(Stringmessage) {super(message);

}publicUserNotFoundException(Throwable cause) {super(cause);

}publicUserNotFoundException(String message,Throwable cause) {super(message, cause);

}

}

packagecom.bjpowernode.struts;public classPasswordErrorException extends RuntimeException {publicPasswordErrorException() {

}publicPasswordErrorException(String message) {super(message);

}publicPasswordErrorException(Throwable cause) {super(cause);

}publicPasswordErrorException(String message,Throwable cause) {super(message, cause);

}

}

7、视图jsp页面调用。

登录界面login.jsp,错误显示界面login_error.jsp,登录成功界面login_success.jsp。代码如下所示。

Inserttitle here

用户:
密码:

Login_success.jsp.

Insert title here

Login_error.jsp界面。

Insert title here

--%>

${msg }

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33632843/article/details/114231588

智能推荐

ParseError错误-程序员宅基地

文章浏览阅读1.4k次。问题:ParseError!原因分析:在服务器中发送数据后,返回json格式中,由于没有解释到json格式,就会出现这个错误!出现情况:1、json格式中有换行符 ;2、jQuery从1.4开始就对json严格化了,需要对值加上双引号。[jQuery 1.3中不会出现这个问题];3、还未遇到…… [希望有遇到除以上两种情况外的朋友 提一下!可多交流..._parseerror at /user/userlist

POJ - 3026 Borg Maze bfs+最小生成树。-程序员宅基地

文章浏览阅读55次。http://poj.org/problem?id=3026题意:给你一个迷宫,里面有 ‘S’起点,‘A’标记,‘#’墙壁,‘ ’空地。求从S出发,经过所有A所需要的最短路。你有一个特殊能力,当走到S或A时可以分身出任意多个人一起走。计算路程时就是所有人的总路程之和。题解:想一下,是裸的最短路套上bfs。  先暴力bfs出各个点之间的距离,存边  然后kruskal...

Opencv-Python(11)-车牌识别-实例源码_china_plate_number.xml-程序员宅基地

文章浏览阅读870次。应用:在视频中扫描车牌号,按下s键,可保存车牌到文件夹中。demoimport cv2nPlateCascade = cv2.CascadeClassifier("Resources/haarcascades/haarcascade_russian_plate_number.xml")img = cv2.imread("Resources/carNumber.jpg")minArea = 100color = (255,0,255)count=0while True: #视频.._china_plate_number.xml

DevExpress之ChartControl用法-程序员宅基地

文章浏览阅读446次。DevExpress中的ChartControl顾名思义就是数据基于图表展示,其关键在于Series上的处理。using System;using System.Drawing;using DevExpress.XtraCharts;namespace DevExpressUtilHelpV3{public static class ChartToolV3..._devexpress.xtracharts.chartcontrol刻度小数

idea 2016.1 激活码-程序员宅基地

文章浏览阅读1.2k次。服务器激活方式,地址http://idea.iteblog.com/key.php

论文源代码_论文写源代码-程序员宅基地

文章浏览阅读1.1k次。写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友。 1.Github 强烈推荐这个网站: https://github.com/ 具体界面如下图所示,搜索框输入关键词,便会出来结果,然后点击相应部分即可 2.Catalyzex 首先给出这个网站的网址: https://www.catalyzex.com/paper/arxiv:1701.04099 具体界面如下图所示,左上角输入名字,便会出来结果,然后点击code部分即可 3.Papers with Cod_论文写源代码

随便推点

Three.js教程:构建矩形平面几何体_three 矩形-程序员宅基地

文章浏览阅读332次。一个矩形平面,可以至少通过两个三角形拼接而成。而且两个三角形有两个顶点的坐标是重合的。注意三角形的正反面问题:保证矩形平面两个三角形的正面是一样的,也就是从一个方向观察,两个三角形都是逆时针或顺时针。0, 0, 0, //顶点1坐标80, 0, 0, //顶点2坐标80, 80, 0, //顶点3坐标0, 0, 0, //顶点4坐标 和顶点1位置相同80, 80, 0, //顶点5坐标 和顶点3位置相同0, 80, 0, //顶点6坐标]);_three 矩形

Spring JTA multiple resource transactions in Tomcat with Atomikos example--转载-程序员宅基地

文章浏览阅读109次。原文地址:http://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-atomikos-example.htmlIn this tutorial we shall show you how to implement JTA multiple resource..._atomikos tomcat lookup

分块详解-程序员宅基地

文章浏览阅读180次。hzwer的9题https://loj.ac/problem/6277https://loj.ac/problem/6278https://loj.ac/problem/6279https://loj.ac/problem/6280https://loj.ac/problem/6281https://loj.ac/problem/6282https://loj.ac/pro..._ai5412a

vscode写vue模板--代码片段-程序员宅基地

文章浏览阅读114次。Ctrl+Shift+P打开命令输入 snippet (打开用户代码片段)在输入vue(选择代码片段的语言)如果搜索不到,安装一个插件 vueHelper如果搜索到复制粘贴以下代码{ "Print to console": { "prefix": "vue", "body": [ "<template>"..._vetur代码片段template

Windows下VsCode的简单配置-程序员宅基地

文章浏览阅读227次。1. 安装插件2. 配置终端软件安装cmder添加cmder按下ctrl+shift+p键,输入setting,打开user settings如图:将"terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\cmd.exe",注释掉,换成:"terminal.integrated.shell.w..._vscode terminal.integrated.env.windows

图片滑块验证码的解决-程序员宅基地

文章浏览阅读775次。https://blog.csdn.net/w18756901575/article/details/78615275其他的不多说,直奔主题:本次是以微信注册中所遇到滑块验证码为例,主要的目的就是让脚本实现自动识别阴影部分的位置,然后计算出距离拖动滑块完成验证操作 想要从1处滑动到2处,就需要知道1处和2处的中间点的x轴坐标位置,1点的坐标基本是固定的,2点的坐标是不..._图片滑动验证码抓不到验证确认