Struts2框架学习

入门重温学习记录:技术可能因为市场的选择,面临所谓的过时之说,没有过去就没有当下。

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值