struts2初步使用及详解

来源:互联网 发布:数据挖掘 推荐系统 编辑:程序博客网 时间:2024/06/05 22:54

背景

前段时间,自己搭建了个s2sh的框架,为了把每个框架的细节给说明,我又将它分解成了单独的模块进行描述。那么首先,就讲解下这个struts2。

struts2与servlet

这个是不得不说的地方,简而言之,struts2是对servlet的封装,也就是在servlet的基础上开发出来的。struts2的核心就是拦截器,而这个与servlet的过滤器的功能基本相同。除了struts2是用于拦截action的,servlet是处理html,jsp等。

这里我暂且先介绍它们,之后我再想写下关于自己自定义拦截器。并且也用servlet来制作个demo,进行对比。我也好加强下印象。

核心包

struts2的核心包就几个,大家可以百度下。那么我主要拿出8个来用,一般都只用这5个,甚至还会更少。
  • struts2-core-2.1.8.1    struts2的核心jar包,不可缺少的
  • xwork-core-2.1.6    xwork的核心包,由于Struts2是由xwork的延伸 有些类依然关联着 xwork的类

  • commons-fileupload-1.2.1.jar , commons-io.jar     struts的上传下载 两者缺一不可

  • commons-lang-3-3.1.jar    为java.lang包提供扩展
  • commons-logging-1.0.4    Jakarta的通用日志记录包
  • freemarker-2.3.15    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具
  • ognl-2.7.3    是支持ognl表达式

这些网络上都能查的到,那么我说说我自己对这些包的看法,我简而言之。尽量通俗点

一、struts2-core是核心包,无话可说。二、xwork-core是核心包,struts是基础xwork编写的。三、commons-lang是java.lang的拓展,主要是toString,enum枚举等,我没用到过。四、commons-logging是日志包,用来打印日志和log4j差不多。一般我们会使用log4j。五、freemarker是生成页面的模板,加载速度比jsp快很多。struts2的标签是freemarker写的。六、ognl是表达式有基本的三种用法,如#request.userName相当于request.getAttribute("userName");

引用包

我这里用自己的私服去加载的,但是私服访问的除了中央仓库,还有阿里云的仓库。

http://maven.aliyun.com/nexus/content/groups/public/ 

不知道为什么开源中国的私服,我访问不了了。

<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.1.8.1</version>

这里我挺奇怪一点的,就是我只引用了一个struts核心包,为什么其他的核心包,都被加载了? 对于这个疑问,我个人认为是阿里云的私服做的贡献吧。我说的对吗?

maven加载后的图

这里写图片描述

只有一个引用,就这么多包。

配置文件

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- struts2的配置 -->
<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>
<welcome-file-list>
<welcome-file>jsp/index.jsp</welcome-file>
</welcome-file-list>
</web-app>

这是配置拦截器的。

  • 其中那个class是使用我们引用的struts2核心包中自带的类,是一个默认类。我们还可以自定义这个类。之后我再详解这个。

  • url-pattern 后的 /* , 是代表拦截类型。这个就代表着不管什么类型都是通过struts来拦截的。还可以写成

    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
    </filter-mapping>

    那么这个过滤器是可以写多个的。

struts.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="action.LoginAction" method="aString">
<result name="success">jsp/success.jsp</result>
<result name="error">jsp/error.jsp</result>
</action>
</package>
</struts>

struts标签前面的一如既往,复制就好。这个就是个协议。
namespace后面跟个斜杠,就是说明直接在拦截………额,不知道怎么说,我直接举个例子
比如我的项目叫做Struts2Test。那么我访问的地址是

http://localhost:8099/Struts2Test  

那么我的namespace=“/”,就是拦截,比如一个login.action

http://localhost:8099/Struts2Test/login.action

那么如果我namespace=”/aaa”,仍然要拦截login.action我就只能拦截aaa下的login.action

http://localhost:8099/Struts2Test/aaa/login.action 

这个就是可以拿来做权限控制。拦截了这个,返回的界面,也是要找到/aaa下的页面的。也就是/aaa/jsp/error.jsp

另外,如果package name=”default” namespace=”/”中,这个name修改为如:name=”test”,那么就会去找到,拦截test的action,如果不存在这个action,就回去默认下找,这个默认相当于namespace=”“为空。

http://localhost:8099/aaa/test.action,那如果在 namespace "/aaa" 下没有 test.action 会出现什么情况呢?Struts 还会尝试在默认 namespace,即 "" 下找 test。好比,URL 是 localhost:8099/aaa/test.action 时,如果在 "/aaa/test" namespace 下找不到 test.action,也是到 "" (default namespace) 下找 test.action,但不会去 "/aaa" 下找。

action及jsp

login.action

```package actioimport com.opensymphony.xwork2.Actionpublic class LoginAction{ private String uname; //表单中的姓名  private String upass; //表单中的密码  //执行方法  public String aString(){     System.out.println(uname+"-----"+     upass);     return "success"; } public String getUpass() {  return upass;  }  public void setUpass(String upass) {  this.upass = upass;  }  public String getUname() {  return uname;  }  public void setUname(String uname) {  this.uname = uname;  } }

action中的属性,从前台页面获取的,都需要用get,set方法。这个其实就是封装了request。用get,set方法更简便。但是要记住加上。
这个方法还可以实现Action类,直接使用它的execute,方法。这样就会自行运行,不需要在struts中设置method。

index.jsp

<body><form action="login"> 用户名:<input type="text"      name="uname"><br>  密 码:<input type="text" name="upass"><br> <input type="submit" value="登陆" /> </form> 

action提交的名字,记得和struts相对应,否则拦截不到了。

error.jsp与success.jsp

error.jsp

<body>失败</body>

success.jsp

<body>成功</body>

就这样,挂到tomcat上运行下,就能出结果啦。

关于用namespace作为权限控制的问题,到时候还可以继续探讨下,我只是初步描述了下用法。

1 0