1.Struts的几个基本概念

1.struts是一个开源框架(frameset) 
2.struts是一个Web框架 
3.struts是一个基于MVC的Web框架

2.为什么有struts

因为我们对MVC的理解不同,可能造成不同公司写程序的时候,规范不统一,这样不利于程序的维护和扩展以及提高开发效率,所以我们有必要用一个统一的规范来开发项目。所以出现了struts.

struts是通过采用Java的Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品

struts的优缺点如下: 
1.struts的好处:

程序更加规范化 
程序开发的效率提高了 
程序的可读性增加 
程序的可维护性增加

2.struts的不足之处:

form表单有点鸡肋 
action是单态(对网站并发性的处理有影响)

这些内容后面会介绍。

我们要知道的是:框架在提高了程序的规范的同时,也约束了程序员的自由。

3.struts的原理

以一个用户登录验证的例子说明。

3.1.时序图

1.ActionServlet是总控制器,它是struts给我们提供的,我们无需自己写,只需要配置即可。ActionServlet管理struts-config.xml文件,而这个文件是struts的核心文件,该文件配置了ActionForm,还配置了Action,以及它们的对应关系等。 
2.ActionForm是表单,用于存放数据。开发ActionFrom必须要继承ActionForm类,这是规范。 
3.Action是分控制器,在Struts中,Action可以有多个.它的本质就是Servlet。开发一个Action也要继承Action类。 
4.Model(Java类,Service类,ejb等)

3.2.struts入门案例

以上述用户登录验证来演示,并且使用手动配置的方式来开发第一个struts项目,项目名称为strutslogin。 
首先,项目目录结构如下所示:

【步骤】: 
1.在开发struts的时候,需要struts的开发包

struts的开发包可到官网下载【下载地址】,它的最新版本是2.5.1(2016年6月21日)。由于目前所学为1.3的版本,所以我下载Struts 1.3.10。并把所有的jar包加入到当前项目的lib文件夹。


2.先写出login.jsp

写最简单的登录页面login.jsp,如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<form action="/strutslogin/login.do" method="post">
UserName:<input type="text" name="username"/><br><br>
Password:<input type="password" name="password"/><br><br>
<input type="submit" value="Login"/>
</form>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 注意,为了安全起见,login.jsp放在WEB-INF目录下,在WEB-INF目录外通过index.jsp转发到login.jsp。
  • 注意form中的action跳转地址,是我们的web应用下的login.do页面,这里在稍后介绍的struts-config.xml配置中会再说明。 

3.编写ActionForm和Action

(1)首先需要编写ActionForm,即用户登录所用的表单,用于填充用户输入的数据。我们取名为UserForm,它继承自ActionForm类,如下:

public class UserForm extends ActionForm {

    private String username;
private String password; 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;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

其实这就是一个很简单的JavaBean,它和login.jsp中的表单对应,我们在这个UserForm中定义属性usernamepassword,并生成它们的settergetter方法。 
这里需要注意的是:

<1>.一般的规范:定义属性名称的时候应该和jsp页面的控件名称一样。 
<2>.但其实,属性的名称并非一定要一致,而真正要保持一致的是settergetter方法。也就是说,如果你在jsp中定义的控件名称为username和password,那么setter方法的名称一定是setUsernamesetPassword,同理,getter方法的名称一定是getUsernamegetPassword。属性可以换其他的名字,但是这几个方法的名称一定要固定格式:get/set+控件名称并且首字母大写 
<3>.但我们遵守一般的规范最好。 
<4>.ActionForm一定要按照上述规范写好,才能保证数据能够正确填充,才能保证work

(2)然后,编写Action,即登录的Action,我们取名为LoginAction,它必须继承自Action类,如下:

public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 把form转成对应的UserForm对象
UserForm userForm = (UserForm)form;
System.out.println("用户名="+userForm.getUsername());
System.out.println("密码="+userForm.getPassword());
// 简单验证
if("123".equals(userForm.getPassword())){
// 如果用户密码为123,则为合法
return mapping.findForward("ok");
}else{
return mapping.findForward("error");
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这个类中,我们需要重写一个方法:excute。这个方法会处理业务逻辑,会自动调用,它有点类似于Servlet中的service方法,或者doGet/doPost方法。


4.配置struts-config.xml文件,这个文件一般放在/WEB-INF目录下,它配置Action、ActionForm以及它们的对应关系和跳转

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Structs Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config>
<!-- 配置表单 -->
<form-beans>
<!-- name是表单名字,可以随意写,但是建议取名规范:表单类名小写 -->
<!-- type用于指定表单类的全路径 -->
<form-bean name="userForm" type="com.gavin.forms.UserForm"></form-bean>
</form-beans>
<!-- 配置Action -->
<action-mappings>
<!-- 配置一个具体的action -->
<!-- path表示将来访问该action的资源名,http://localhost:8080/web/path -->
<!-- name用于关联某个表单 -->
<!-- type用于指定该Action类的全路径 -->
<action path="/login" name="userForm" type="com.gavin.actions.LoginAction">
<!-- 这里配置跳转关系 -->
<!-- name表示结果名称,path表示转发到的页面地址 -->
<forward name="ok" path="/WEB-INF/welcome.jsp"/>
<forward name="error" path="/WEB-INF/error.jsp"/>
</action>
</action-mappings>
</struts-config>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

(1)这个struts-config.xml引入了一个DTD文件:struts-config_1_3.dtd,这个文件可以在我们下载的jar包中找到,它定义了我们这个xml的约束,根元素为struts-config。 
(2)该配置文件主要通过form-beans来配置ActionForm、通过action-mappings来配置Action。 
(3)我们在form-beans下用form-bean来配置具体的ActionForm,比如当前文件配置了我们写的UserForm 
(4)在action-mappings下用action来配置具体的Action,比如当前文件配置了我们写的LoginAction 
(5)要注意这里action中的path参数配置,它就是我们的login.jsp中的表单action提交的地址,login.jsp中写的是login.do,这个login.do会交给struts的总控制器ActionServlet来处理,最后ActionServlet将通过一定的机制找到这里的path参数配置为/login的action,再通过该action配置的type参数找到具体的类。

从这个过程中我们可以发现,login.do在通过ActionServlet的处理后,最后找到的却是路径为/login的action,这似乎和.do这个后缀没有什么关系,的确是这样的,这个后缀只是习惯上的用法,我们完全可以在web.xml文件中将这个后缀设置成其他任何的名字。 
(6)最后要在具体的action下配置跳转关系。这里配置的参数和LoginAction中的excute方法所写要对应起来。


5.写出welcome.jsp和error.jsp页面

写出两个简单的界面即可。


6.在web.xml中配置ActionServlet

struts的总控制器ActionServlet本质上还是一个Servlet,所以我们要在web.xml中配置,配置如下:

<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<!-- 指定配置文件struts-config.xml的路径 -->
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
</servlet> <servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

我们要在该配置中指定struts-config.xml文件的地址。同时可以看到,我们在这里配置的后缀为*.do,也就是说所有以.do结尾的请求都要交给ActionServlet来处理。到这里,也就明白了为什么我们的login.jsp中写的提交地址为login.do

4.总结

通过手工完成一个简单的struts项目,可以让我们对struts的工作流程和工作原理有更加深刻的认识。这个过程略微繁琐,后面会有工具直接生成,但是掌握底层原理是我们学习必不可少的一个步骤。

总结一下,其实struts是对我们通过JSP/Servlet和使用MVC模式开发项目的一个更高层次地提炼,它帮我们做了大部分工作,我们只需要按照struts框架提供的流程填充即可,简化了我们的开发的难度。

struts中的核心知识点:ActionServlet总控制器,Action分控制器,ActionForm表单,以及最重要的structs-config.xml和web.xml文件的配置。

Struts1.3——Struts入门的更多相关文章

  1. struts入门实例

    入门实例 1  .下载struts-2.3.16.3-all  .不摆了.看哈就会下载了. 2  . 解压  后 找到 apps 文件夹. 3.    打开后将 struts2-blank.war   ...

  2. struts入门初步(一)

      struts2.0与struts1.0运用了不同的框架,有一定的不兼容性. struts2.0借鉴了webwork的框架思想. Struts2的基本步骤: 1.拷贝struts的jar到项目中(导 ...

  3. java框架篇---Struts入门

    首先理解Struts与MVC的关系 在传统的MVC模式中所有的请求都要先交给Servlet处理,之后由Servlet调用JavaBean,并将结果交给JSP中进行显示.结构图如下 Struts是Apa ...

  4. struts入门

    1.概念

  5. Struts入门(三)深入Struts用法讲解

    访问Servlet API Action搜索顺序 动态方法调用 指定多个配置文件 默认Action Struts 后缀 接收参数 处理结果类型 1.访问Servlet API 首先我们了解什么是Ser ...

  6. Struts1.3——Struts标签

    1.struts标签的介绍 Struts框架提供了一组非常丰富的框架组件,同时也提供了一组标签库用于和这些组件交互,主要介绍以下三类: html标签 bean标签 logic标签 2.Html标签库 ...

  7. Java Web编程的主要组件技术——Struts入门

    参考书籍:<J2EE开源编程精要15讲> Struts是一个开源的Java Web框架,很好地实现了MVC设计模式.通过一个配置文件,把各个层面的应用组件联系起来,使组件在程序层面联系较少 ...

  8. Struts入门(二) 配置文件的讲解

    上一章我们演示了Struts项目的搭建  可以看到里面有几个重要的配置文件  下面我们来说明一下这3个配置文件 1.web.xml 2.strtus.xml 3.struts.properties 1 ...

  9. Struts入门学习(三)---自定义类型转换器

    类型转换器是将浏览器传递的参数进行转换为了与服务器端的参数匹配,先举个例子如果我们想往服务器传递日期类型的参数时我们要怎么让浏览器传过去的让服务器明白 我们新建一个类 ConverterTest.ja ...

随机推荐

  1. 用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 reCAPTCHA 应用 reCAPTCHA 前文列表 用 Flask ...

  2. ubuntu+qt+opencv

    linux下Qt+OpenCv环境的搭建: https://blog.csdn.net/yaowangII/article/details/84303124 1.qt:https://blog.csd ...

  3. Java并发AtomicBoolean类~

    java.util.concurrent.atomic.AtomicBoolean类提供了可以原子读取和写入的底层布尔值的操作,并且还包含高级原子操作. AtomicBoolean支持基础布尔变量上的 ...

  4. python基本数据类型集合set操作

    转:https://www.cnblogs.com/tina-python/p/5468495.html 一.集合的定义 set集合,是一个无序且不重复的元素集合. 集合对象是一组无序排列的可哈希的值 ...

  5. Vue 创建组件的两种方法

    地址:https://blog.csdn.net/cofecode/article/details/74634301 创建组件的两种方法 1.全局注册 2.局部注册 var child=Vue.ext ...

  6. Spring 常犯的十大错误,打死都不要犯!

    原文:https://www.toptal.com/spring/top-10-most-common-spring-framework-mistakes 作者:Toni Kukurin,译者:万想 ...

  7. docker--build自己的image

    通过container commit成image [root@localhost docker_test]# docker container commit #可以简写成docker commit a ...

  8. 最新版的node安装和配置注意事项

    node在安装的时候,如果你不想用默认的安装路径,可以自定义路径进行安装,例如我的安装路径如下:F:\Program Files\nodejs 安装完成后,要对node进行配置: 在F:\Progra ...

  9. Shell02---变量

    Shell02---变量 1. shell变量概述 1. 什么是变量 变量是Shell传递数据的一种方法,简单理解:用一个固定的字符串去表示不固定的内容,便于后续引用. 2.变量命令规范 变量定义时名 ...

  10. Razor 保存动态表格

    本文转载自  ASP.NET MVC数组模型绑定 ,https://www.cnblogs.com/choon/p/5429065.html 内容根据评论内容中的方式有所调整 在ASP.NET MVC ...