(最近在写一个ssh的项目,虽然看网上好像都说ssh已经过气了。。。之前虽然老师有上过这个课,我还做了一个PPT专门讲这个来着,但果然没有实践经验还是不容易理解。在参照一个项目写ssh时候,表示四脸蒙圈。。。所以准备先好好理解下概念和基本用法什么的再继续)

内容转自SSH框架学习

搭建Struts2开发环境

1、找到开发Struts 2的应用需要用到的jar包。
2、编写Struts 2的相应Action类并在struts.xml中作相应的配置。
3、在web.xml中加入Struts 2 MVC启动框架配置。
开发Struts 2 最少用到的jar文件:(直接在pom里面加依赖就好,别傻不愣登的再去找jar包了,就和当年愚蠢的我一样。。。)
Struts-core-2.x.x.jar : Struts 2 框架的核心类库
xwork-2.x.x.jar : XWork类库,Struts 2 在其上构建
ognl-2.6.x.jar : Object Graph Navigation Language , Struts 2 框架通过其读写对象的属性。
freemarker-2.3.x.jar : Struts 2 的UI标签的模版使用 Freemarker编写。
commons-logging-1.1.x.jar : ASF出品的日志包。
commons-fileupload-1.2.1.jar : 文件上传组件。

Struts2体系结构 :
1、Web浏览器请求一个资源。
2、过滤器Dispatcher查找方法,确定适当的Action。
3、拦截器自动对请求应用通用功能,如验证和文件上传操作。
4、Action的execute方法通常用来存储和重新获得信息。
5、结果被返回到浏览器。

配置文件:

struts.xml:是Struts 2 的核心配置文件,主要用于配置开发人员编写的action。

web.xml:要使用strus2框架,必须在web.xml中配置相应的过滤器。

实例演示(一位老大哥和我说,程序员之间还是用代码交流方便,虽然我是一只菜鸡,但深以为然,所以里面的一些配置和使用我们还是用实例说话吧)

利用struts2的框架来实现一个用户登录校验的例子。

1、在eclipse中创建一个web工程,并导入struts2的关键jar包到WEB-INF的lib目录下。并在WebContext根目录下创建web.xml,在源文件目录src下创建struts.xml。再创建login.jsp和loginResult.jsp两个jsp文件,用于显示登录界面和登录成功界面。最后创建一个Action类,放在自定义的包下。目录和文件创建完毕,总体目录文件结构如下:

2.配置web.xml和struts.xml两个文件

web.xml的配置如下:(IDEA里自动生成的web.xml的<web-app>里面是没有属性的,记得这些属性一定要添加,之前就是没有添加吃了亏)

<span style="font-size:24px;"><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
</span>

通过<url-pattern>/*</url-pattern>使得struts拦截所有URL请求。而StrutsPrepareAndExecuteFilter中的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后Struts2对用户的每一次请求处理将使用内存中的数据。

Filter 过滤器是用户请求和处理程序之间的一层处理程序。它可以对用户请求和处理程序响应的类容进行处理,通常用于权限、编码转换等场合。

struts.xml的配置如下:

<span style="font-size:24px;"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<package name="LoginTest" extends="struts-default">
<action name="Login" class="com.chen.LoginAction" >
<result>/loginResult.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
</span>

①通过反射机制将请求参数注入到"com.chen.LoginAction1"类中
②调用"com.chen.LoginAction1"类的execute方法,该方法的原型为:public String execute() throws Exception;
③ 根据execute方法返回的String类型的字符串(如"input"),在配置文件中查找该字符串对应的页面,并转到该页面。

<package>标签
如果要配置<Action>的标签,那么必须要先配置<package>标签,代表的包的概念。包含的属性:
name         包的名称,要求是唯一的,管理action配置。
extends      继承,可以继承其他的包,只要继承了,那么该包就包含了其他包的功能,一般都是继承struts-default
namespace    名称空间,一般与<action>标签中的name属性共同决定访问路径,常见的配置如下:
    namespace=""     -- 默认的名称空间(访问的方式和namespace="/"是一样的)
    namespace="/"    -- 根名称空间
    namespace="/aaa" -- 带有名称的名称空间,这样请求action时,URL是/namespace/name的形式
abstract         -- 抽象的。这个属性基本很少使用,值如果是true,那么编写的包是被继承的。

<action>标签
代表配置action类,包含的属性:
name              和<package>标签的namespace属性一起来决定访问路径的。
class             配置Action类的全类名(默认值是ActionSupport类)
method            Action类中执行的方法,如果不指定,默认值是execute方法

<result>标签
action类中方法执行,返回的结果跳转的页面
name      结果页面逻辑视图名称
type        结果类型(默认值是转发,也可以设置其他的值)
注:
设置Struts2默认的Action:
在<package>标签中通过<default-action-ref name="指定action标签name属性"></default-action-ref>来设置默认的Action。当在配置文件中找不到相应的action时,就由默认的action进行处理。
设置Action默认处理类:
在<package>标签中通过<default-class-ref class="指定action类的全路径"></default-class-ref>来设定action的默认处理类。

3、编写jsp文件

login.jsp源码如下:

<span style="font-size:24px;"><%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>登录系统</title></head>
<body><br><br><br>
<div align="center">
<s:text name="welcome message:"/>
${requestScope.message}
<s:form action="Login" method="POST" theme="xhtml">
<s:textfield name="adminUserName" label="用户名"/>
<s:password name="adminUserPassword" size="21" label="密码"/>
<s:submit value="提 交"/>
</s:form>
</div>
</body>
</html></span>

login.jsp中使用了struts2的标签,所以需要有

<%@ taglib prefix="s" uri="/struts-tags"%>

${requestScope.message}显示出登录信息,message的设置在Action类中。

form中设置action="Login",这与struts.xml中的 <action name="Login" class="com.chen.LoginAction" >保持一致。

也就是说,这个表单的数据会提交给com.chen.LoginAction来进行处理。

loginResult.jsp源码如下:

<span style="font-size:24px;"><%@ page contentType="text/html;charset=utf-8" %>
<html>
<head>
<title>验证通过</title>
</head>
<body>
${message}
</body>
</html></span>

4、编写Action类

我们采用继承ActionSupport类的方法来编写自定义的Action类LoginAction。源码如下:

注:这里为了便于测试,直接把用户名和密码都设为admin。实际应用中一般要连接数据库。

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 执行用户验证的方法
*/
public String execute() throws Exception {
if("admin".equals(adminUserName)&&"admin".equals(adminUserPassword))
message=adminUserName+"登录成功!";
else{
message=adminUserName+"登录失败!";
return INPUT;//转到输入界面
}
return SUCCESS;//转到登录成功界面
}
public String adminUserName;//用户名
public String adminUserPassword;//密码
public String message;//execute()执行完后返回的消息
public String getAdminUserName() {
return adminUserName;
}
public void setAdminUserName(String adminUserName) {
this.adminUserName = adminUserName;
}
public String getAdminUserPassword() {
return adminUserPassword;
}
public void setAdminUserPassword(String adminUserPassword) {
this.adminUserPassword = adminUserPassword;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
} }

实现Action
1、把Action看作是POJO类
POJO(Plain Ordinary Java Object)简单的Java对象。简单来说,没有继承某个类,没有实现接口,就是POJO的类。我们直接写一个POJO类,把它当作struts2对应的一个Action类。这个类必须包含处理逻辑所需要的属性及相应的get、set方法,并且提供Struts2调用的execute方法。但通常不推荐这样做,这样不利于统一接口。

2、实现Action接口

Action接口中定义了5个常量,5个常量的值对应的是5个逻辑视图跳转页面(跳转的页面还是需要自己来配置),还定义了一个方法,execute方法,我们可以自己来实现。
常量值如下所示:
SUCCESS       -- 成功.
INPUT         -- 用于数据表单校验.如果校验失败,跳转INPUT视图.
LOGIN         -- 登录.
ERROR         -- 错误.
NONE          -- 页面不转向.

3、继承ActionSupport类,而该类实现了Action 、Validateable 、 ValidationAware 、TextProvider、LocaleProvider,Serializable接口。我们只需要根据实际情况重写一些其中的方法就可以满足需求。

5、编写完毕,将项目运行在Tomcat上,测试即可。

原始界面:

成功界面:

失败界面:

总结:是不是看的有点晕?没关系,我在这里再详细写一下逻辑:

首先,我们从jsp看起。登录系统的原始页面中,有一个submit的提交按钮,方式是post。

<s:form action="Login" method="POST" theme="xhtml">  

提交里面,form中action = ‘login’,和structs.xml里面是一致的,所以会提交到structs.xml里的class的action函数里面

<action name="Login" class="com.chen.LoginAction" >  

这里面提交进去以后,会有两个返回,也是在structs.xml里写到的,默认的和input的

<result>/loginResult.jsp</result>
<result name="input">/login.jsp</result>

那什么时候进入哪个返回呢?我们再进入action里面看看

if("admin".equals(adminUserName)&&"admin".equals(adminUserPassword))
message=adminUserName+"登录成功!";
return SUCCESS;//转到登录成功界面
else{
message=adminUserName+"登录失败!";
return INPUT;//转到输入界面
}

这里,SUCCESS是默认的。同时也可以看到,这里还有message,是返回时返回的信息。

如果成功了,进入login.jsp,获得的信息是message,显示的位置是

<s:text name="welcome message:"/>
${requestScope.message}

如果失败了,进入loginResult.jsp,获得的信息还是message,显示的位置是

<body>
${message}
</body>

这里两个返回的message方法不同,是因为login.jsp页面是post方法,传出再传入的。而loginResult.jsp是直接get一个数据,两种情况不一样。

requestScope通常是将某个变量或者对象在servlet或者acion中通过request.setAttribute()方法放入到request对象中,然后在页面中使用requestScope来进行数据的显示的

struct 2 基本知识的更多相关文章

  1. Java web struct入门基础知识

    1.Struts2的前身是Opensymphony的Webwork2,实际上Strut和Webwork2合并后形成Struts2.   2.一个HelloWord示例 1)创建Web应用,所需要的Ja ...

  2. Golang面向对象编程-struct(结构体)

    Golang面向对象编程-struct(结构体) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是面向对象编程 面向对象编程(Object Oriented Program ...

  3. Swift 浅谈Struct与Class

    讨论Struct与Class之前,我们先来看一个概念:Value Type(值类型),Reference Type(引用类型): 1. 值类型的变量直接包含他们的数据,对于值类型都有他们自己的数据副本 ...

  4. C# 静态类

    静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享. 探究 public static class StaticTestClass { ; public static void ...

  5. C#静态类 转载:(原文:http://www.cnblogs.com/chenlulouis/ )

    静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享. 探究 public static class StaticTestClass{    public static int ...

  6. C#静态类、静态构造函数,类与结构体的比较

    一.静态类 静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享. 探究 public static class StaticTestClass{    public stati ...

  7. Linux内核驱动学习(三)字符型设备驱动之初体验

    Linux字符型设备驱动之初体验 文章目录 Linux字符型设备驱动之初体验 前言 框架 字符型设备 程序实现 cdev kobj owner file_operations dev_t 设备注册过程 ...

  8. 结构体struct知识

    2022-10-12 08:52:03 //    结构体知识#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<m ...

  9. C/C++语法知识:typedef struct 用法详解

    第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定 ...

随机推荐

  1. C控制语句:分支和跳转

    小技巧:程序return前加个getchar();可以让程序停住.%%可以打印使printf()中打印出%号 #include<stdio.h>#define SPACE ''int ma ...

  2. 微信小程序 sha1 实现密码加密

    在utils中的util.js 文件中增加 函数 实现 字符串转换为16进制加密后的字符串 function encodeUTF8(s) { var i, r = [], c, x; for (i = ...

  3. ubuntu安装nginx和设置网站https访问

    安装nginx 在控制台 输入 sudo apt-get install nginx 等待安装成功之后.可以打开浏览器.输入你的域名或者ip地址会出现"Welcome to nginx!&q ...

  4. Java基础系列--final关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8482909.html 一.概述 final是Java关键字中最常见之一,表示"最 ...

  5. DxPackNet 4.保存音视频为本地avi文件

    捕获到了音视频后要保存到本地文件,这是很常见的应用场景,DxPackNet保存视频文件也比较简单 用 IAviStreamWriter  avi文件写入流即可 1.初始化相关设备,设定好数据捕获的回调 ...

  6. # C# 如何调用动态连接库?

    导入命名空间 using System.Runtime.InteropServices; 把 非托管DLL放入执行程序同级目录,比如 Debug .Release . [DllImport(" ...

  7. LOJ6001 - 「网络流 24 题」太空飞行计划

    原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...

  8. http协议——cookie详解

    http是无状态的,所以引入了cookie来管理服务器与客户端之间的状态 与cookie相关的http首部字段有: 1.Set-Cookie:它一个响应首部字段,从服务器发送到客户端,当服务器想开始通 ...

  9. Android使用百度地图出现闪退及定位时显示蓝屏问题

     目录 1.Android使用百度地图出现闪退 2.Android使用百度地图定位出现蓝屏问题     1.Android使用百度地图出现闪退 一般情况下出现闪退是在AndroidManifest.x ...

  10. javascript中快速求数组的全部元素的相加之和

    js中快速求数组的全部元素的相加之和: var arr = [1,2,3,4,5];var sum = eval(arr.join('+')); console.log(sum); 运行结果: 15