入门重温学习记录:技术可能因为市场的选择,面临所谓的过时之说,没有过去就没有当下。
1:引用struts2的类库文件,搭建好项目:
新建java web项目,去struts官网下载所需版本。本例为:2.3.37版本。将所需structs2 jar文件粘贴到WEB-INF/lib文件夹下。
在src/main/java 文件夹下新增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>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<package name="example" extends="struts-default">
<action name="userLogin" class="example.HandlerAction">
<result name="success">/index.jsp</result>
<result name="unlogin">/login.jsp</result>
</action>
</package>
</struts>
配置web.xml文件
<?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_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>webapp2</display-name>
<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 是一个mvc框架,当接收http请求后,交给StrutsPrepareAndExecuteFilter过滤器拦截,通过struts.xml的配置,找到对应的action对象,执行action方法,返回指定的jsp页面视图。
2:编写Action处理类
调用Action对象,默认执行的是execute方法,也可以将一个请求交给指定的方法执行。
package example;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class HandlerAction extends ActionSupport implements ModelDriven<UserInfo> {
UserInfo user=new UserInfo();
private static final long serialVersionUID = 1L;
@Override
public String execute() throws Exception {
System.out.print(">>>>>测试执行成功!!!!");
return "unlogin";
}
public String login() {
var session= ActionContext.getContext().getSession();
if(this.user.getUserName().equals("admin")) {
session.put("userInfo", "admin");
System.out.println("用户:"+ this.user.getUserName());
System.out.println("密码:"+ this.user.getUserPassword());
return "success";
}
System.out.print("Error: 未登录成功");
return "unlogin";
}
@Override
public UserInfo getModel() {
return this.user;
}
}
jsp页面调用:
<form style="width:300px;" action="userLogin!login" method="post">
<input class="form-control" maxlength="20" type="text" name="userName" value="admin"/>
<input class="form-control" maxlength="20" type="password" name="userPassword" value=""/>
<input class="btn btn-primary" type="submit" value="登录"/>
</form>
注意form 中的action 的值userLogin!login,userLogin为struts.xml中配置的action名称,中间使用"!"隔开action名称下的方法名(Action默认的访问后缀是".action")。
3:参数注入
在struts2 框架中,表单提交的参数会使用IoC原理自动注入到Action对象所在的属性中(DomainModel域模型)。如果Action实现了ModelDriven接口,则调用getModel方法获取实例对象模型。区别在于可以简化下面的写法:user.userName等;
<input class="form-control" maxlength="20" type="text" name="user.userName" value="admin"/>
<input class="form-control" maxlength="20" type="password" name="user.userPassword" value=""/>
4:拦截器
struts2拦截器可以在执行Action前后执行一些操作,原理在于过滤器创建了Action的代理,在执行代理方法前后执行我们定义的拦截操作。实现拦截器需要实现Interceptor接口。struts2中已经定义预设了一些拦截器,为了简化开发,我们可以编写扩展com.opensymphony.xwork2.interceptor.AbstractInterceptor的自定义拦截器.
public class LoginInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation action) throws Exception {
var context = action.getInvocationContext();
var session = context.getSession();
if(session.get("userInfo")==null) {
return "unlogin";
}
System.out.println(">>:登录验证通过...");
return action.invoke();
}
}
struts.xml中拦截器的配置修改:
<package name="example" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="loginInterceptor" class="example.LoginInterceptor"/>
<interceptor-stack name="loginDefaultInterceptor">
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="userLogin" class="example.HandlerAction">
<result name="success">/index.jsp</result>
<result name="unlogin">/login.jsp</result>
</action>
<action name="userLoginValidate" class="example.HandlerAction">
<result name="success">/success.jsp</result>
<result name="unlogin">/unlogin.jsp</result>
<result name="input">/index.jsp</result>
<interceptor-ref name="loginDefaultInterceptor"/>
</action>
</package>
5:struts数据验证
使用Struts2验证框架,验证文件的命名必需遵循一定的规则,且和Action对象放置在同一个目录,验证文件有2中形式:
“Action名称-validation.xml”和“ Action名称-struts中定义的别名-validation.xml” 两种形式
例如:更新用户信息时,验证输入是否合法。
HandlerAction-userUpdate-validation.xml的内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.dtd">
<validators>
<field name="userName">
<field-validator type="requiredstring">
<message>请输入用户名称</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>用户名称长度在${minLength}和${maxLength}之间</message>
</field-validator>
</field>
<field name="userPassword">
<field-validator type="requiredstring">
<message>请输入密码</message>
</field-validator>
</field>
</validators>
JSP页面
<form style="width:300px;" action="userUpdate!updateUser" method="post">
<div class="form-group">
<input class="form-control" maxlength="20" type="text" name="userName" value=""/>
<s:fielderror fieldName="userName"></s:fielderror>
</div>
<div class="form-group">
<input class="form-control" maxlength="20" type="password" name="userPassword" value="test123"/>
<s:fielderror fieldName="userPassword"></s:fielderror>
</div>
<div class="form-group">
<input class="btn btn-primary btn-lg btn-block" type="submit" value="修改用户信息"/>
</div>
</form>