Struts2实例
src下创建com.Struts2Test.HelloStruts
LoginAction.java
package com.Struts2Test.HelloStruts;
/**
* Created by elijahliu on 2017/2/22.
*/
public class LoginAction {
private String username;
private String password;
public String execute() {
if (username.equals("admin") && password.equals("123")) {
return "success";
} else {
return "fail";
}
}
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;
}
}
这里的execute()方法会由Struts自动调用,有点像servtlet的service方法那样。
src下创建struts.xml配置文件
<?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>
<!--该标签用于创建一个JavaBean实例-->
<!--bean class=""></bean>-->
<!--该标签用于Struts2默认行为标签,改变默认配置-->
<!--这里设置了编码集,也就是运行struts(相当于过滤器)后,就不需要在每个servlet中写
HttpServletRequest.setCharacterEncodingd了-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--这一条也就是说如果不配置的话,只会拦截后缀名为.action请求,配置后,过滤器也会拦截后缀.do的请求-->
<constant name="struts.action.extension" value="do"/>
<!--这个属性设置是指浏览器是否缓存静态内容,默认是true,但是开发阶段建议关闭,避免修改后测试不准-->
<constant name="struts.serve.static.browserCache" value="false"/>
<!--当struts配置文件修改后,系统是否重新加载该文件,默认为false-->
<constant name="struts.configuration.xml.reload" value="true"/>
<!--开发模式下使用,可以打印出更加详细的错误信息-->
<constant name="struts.devMode" value="true"/>
<!--默认试图主题-->
<constant name="struts.ui.theme" value="simple"/>
<!--该标签用于区分不同的请求文件的标签,比如 网站前台请求,或网站后台请求-->
<!--name属性:包名,用于被别的包调用或继承-->
<package name="com.Struts2Test" namespace="/new" extends="struts-default">
<!--action相当于以前的servlet的概念,对应一个请求name为请求的url地址
如访问这个 action的话 url为 localhost:8080/项目名/new/login.do
/new为命名空间,.do为后缀 上面constant里有配置
-->
<action name="login" class="com.Struts2Test.HelloStruts.LoginAction">
<!--这个标签配置了返回结果页面-->
<!--这个result标签中的name 对应的是loginAction.java中的返回值-->
<result name="success">/success.jsp</result>
<result name="fail">/fail.jsp</result>
</action>
</package>
<!--用于引入其他的xml配置文件-->
<!--<include file=""/>-->
</struts>
最后添加Struts的web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>
Struts2拦截器
这里的拦截器其实本质上就是一个过滤器,说法不同,也是采用了AOP的思想,将业务抽离解耦
拦截器实例
创建LoginAction2.java
package com.Struts2Test.HelloStruts;
import com.opensymphony.xwork2.ActionSupport;
/**
* Created by elijahliu on 2017/2/22.
*/
public class LoginAction2 extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("进入了LoginAction2");
return SUCCESS;
}
}
创建拦截器 FirstInterceptor.java
package com.Struts2Test.HelloStruts;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
* Created by elijahliu on 2017/2/22.
*/
public class FirstIntercepter implements Interceptor {
private String someThing;
@Override
public void destroy() {
}
@Override
public void init() {//当程序启动的时候 拦截器就被初始化完毕了
System.out.print("拦截器启动完毕了");
}
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
String returname = actionInvocation.invoke();//该方法让到达拦截器的请求继续前进,访问后面需要访问的
//运行这个方法就是放过区,类似于filter过滤器中的doFilter()方法,里面又个chain对象用法相同
return returname;
}
public void setSomeThing(String someThing) {
this.someThing = someThing;
}
public String getSomeThing() {
return someThing;
}
}
修改struts.xml配置文件
<package name="com.Struts2Test" namespace="/new" extends="struts-default">
<interceptors>
<interceptor name="FirstInterceptor" class="com.Struts2Test.HelloStruts.FirstIntercepter">
<param name="someThing">test</param>
</interceptor>
<interceptor-stack name="AllInterceptor"> <!--这里设置了一个拦截器栈-->
<interceptor-ref name="FirstInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="AllInterceptor"/><!--将allinterceptor拦截器设置成默认的系统拦截器,即使action中没有配置 也能访问到-->
<!--action相当于以前的servlet的概念,对应一个请求name为请求的url地址
如访问这个 action的话 url为 localhost:8080/项目名/new/login.do
/new为命名空间,.do为后缀 上面constant里有配置
-->
<action name="login" class="com.Struts2Test.HelloStruts.LoginAction">
<!--这个标签配置了返回结果页面-->
<!--这个result标签中的name 对应的是loginAction.java中的返回值-->
<result name="success">/success.jsp</result>
<result name="fail">/fail.jsp</result>
</action>
<action name="LoginInterceptor" class="com.Struts2Test.HelloStruts.LoginAction2">
<interceptor-ref name="AllInterceptor"/>
<result name="success">/success.jsp</result>
</action>
</package>
添加action LoginAction2,一定要在package下面最开始生命使用的interceptors,这里先声明了一个FirstInterceptor,其中装填了一个参数,也就是someThing装填一个参数,然后声明了一个拦截器栈,里面有刚刚声明的FirstInterceptor,还有一个系统默认的拦截器。
那么在下面的loginaction2中引用了拦截器栈,也就是两个拦截器都引用了。这里一定要引用默认的defaultstack,因为如果你自定义了拦截器,他就不会加载默认拦截器,容易出问题。
default-interceptor-ref标签用于声明一个默认的拦截器,也就是package中的其他拦截器不显示的调用,也会默认调用这个拦截器。