概述
背景
前段时间,自己搭建了个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 actio
import com.opensymphony.xwork2.Action
public 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作为权限控制的问题,到时候还可以继续探讨下,我只是初步描述了下用法。
最后
以上就是友好斑马为你收集整理的struts2初步使用及详解的全部内容,希望文章能够帮你解决struts2初步使用及详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复