struts入门(struts中的动态调用与参数赋值及与J2EE容器交互,struts通过结果码跳转页面)

转载请标明出处:https://blog.csdn.net/men_ma/article/details/106847165.
本文出自 不怕报错 就怕不报错的小猿猿 的博客

1.struts2动态调用方法

1.1 用到的xml文件

在这里插入图片描述

1.1.1 先在struts-base.xml中配置动态调用

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
	
<struts>
	<!--开启开发者模式  -->
	<constant name="struts.devMode" value="true"></constant>
	<!--开启自动 加载配置文件 -->
	<constant name="struts.configuration.xml.reload" value="true"></constant>
	
	<!--
		name:包名(最好根据xml的类名来定义)
		extends:继承
		abstarct:是否是抽象类
		namespace:命名空间
	  -->
	<package name="struts-base" extends="struts-default" abstract="true">
	<!-- 配置动态调用 -->
		<global-allowed-methods>regex:.*</global-allowed-methods>
	</package>
</struts>

1.1.2 在struts-user.xml中配置action的方法

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
	
<struts>
	<package name="struts-user" extends="struts-base">
		<action name="loginAction_*"  class="com.xiaoqing.action.UserAction" method="{1}"></action>
		
	</package>
</struts>

1.2 login.jsp(登录界面的form表单提交地址的action就是动态调用方法去访问后台)

在这里插入图片描述

2.参数赋值(利用登录这个小功能:文本框赋值)

2.1 login.jsp中的表单name

在这里插入图片描述

2.2 Action中定义属性,并提供get/set方法

当我们的xml文件这些配置好后确认可以访问到userAction这个类的方法时就可以参数赋值了

userAction类:

public class UserAction implements ModelDriven<User> {

//	在action中定义的属性必须定义该属性的set和get方法
	private String username;
	private String password;
	
	/**
	 * 登录方法
	 * @return
	 */
	public String login() {
		System.out.print(username);
		System.out.print(password);
		return null;
	}
	

	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;
	}

}

效果:
在这里插入图片描述
在这里插入图片描述

2.3 ModelDriven 返回实体,不能为null,不需要提供get/set方法

2.3.1 user.java实体类:

public class User implements Serializable{
	
	private String username;
	private String password;
	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;
	}
	public User() {
		super();
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}
}

2.3.2 userAction类中(注意观察代码):需要实现ModelDriven

public class UserAction implements ModelDriven<User> {
	
	private User user=new User();
	
//	在action中定义的属性必须定义该属性的set和get方法
	private String username;
	private String password;
	
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
	/**
	 * 登录方法
	 * @return
	 */
	public String login() {
		System.out.println("username="+username);
		System.out.println("password="+password);
		
		System.out.println("modledriven中:");
		System.out.println("username="+user.getUsername());
		System.out.println("password="+user.getPassword());
		return null;
	}
	

	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;
	}
	
	
}

效果:
在这里插入图片描述

在这里插入图片描述
要点:ModelDriven返回实体和Action中属性重名,ModelDriven中优先级更高

3.struts中跳转页面:重定向或者转发

利用返回的结果码进行跳转,在struts-user.xml中配置如下:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
	
<struts>
	<package name="struts-user" extends="struts-base">
		<action name="loginAction_*" 
		class="com.xiaoqing.action.UserAction"
		method="{1}">
		<!--
			name:跳转路径
			type:默认是转发=dispatcher,重定向=redirect
		  -->
			<!-- <result name="success" type="dispatcher">/index.jsp</result>
			<result name="error" type="redirect">/error.jsp</result>  -->
		</action>
	</package>
</struts>

userAction类:

public class UserAction implements ModelDriven<User> {
	
	private User user=new User();
	
//	在action中定义的属性必须定义该属性的set和get方法
	private String username;
	private String password;
	
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
	/**
	 * 登录方法
	 * @return
	 */
	public String login() {
	
		if("xiao".equals(user.getUsername())&&"123".equals(user.getPassword())) {
			return "success";
		}else {
			return "error";
		}
	}
	

	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;
	}
}

4.与J2EE容器交互

如何理解非注入和注入?

博主大白话:举一个生活的例子,如果我们感冒很严重,要么吃药,要么打针,吃药就代表非注入,打针就代表注入

4.1 非注入方式

耦合和解耦实际上是struts2和servlet的关系

4.1.1 耦合

userAction:


public class UserAction implements ModelDriven<User> {
	
	private User user=new User();
	
//	在action中定义的属性必须定义该属性的set和get方法
	private String username;
	private String password;
	
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
//	非注入耦合方式,和servlet关系紧密
	private HttpServletRequest req=ServletActionContext.getRequest();;
	private HttpServletResponse resp=ServletActionContext.getResponse();
	
	/**
	 * 登录方法
	 * @return
	 */
	public String login() {
		if("xiao".equals(user.getUsername())&&"123".equals(user.getPassword())) {
			req.setAttribute("username", user.getUsername());
			return "success";
		}else {
			return "error";
		}
	}
	

	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;
	}
	
	
}

效果:
在这里插入图片描述
在这里插入图片描述

4.1.2 解耦(建立使用解耦模式)

userAction类:


public class UserAction implements ModelDriven<User> {
	
	private User user=new User();
	
//	在action中定义的属性必须定义该属性的set和get方法
	private String username;
	private String password;
	
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
	
	/**
	 * 登录方法
	 * @return
	 */
	public String login() {
		if("xiao".equals(user.getUsername())&&"123".equals(user.getPassword())) {
//			非注入的解耦方式
			ActionContext context = ActionContext.getContext();
			Map<String, Object> map = context.getContextMap();
			map.put("username", user.getUsername());
			return "success";
		}else {
			return "error";
		}
	}
	

	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;
	}
	
	
}

效果如上一样

4.2 注入方式(常用)

4.2.1 耦合方式(实现ServletRequestAware/ServletResponseAware接口)

userAction类:


public class UserAction implements ModelDriven<User>,ServletRequestAware,ServletResponseAware {
	
	private User user=new User();
	
//	在action中定义的属性必须定义该属性的set和get方法
	private String username;
	private String password;
	
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
	
//	注入式的耦合:ServletRequestAware,ServletResponseAware
	private HttpServletRequest req;
	private HttpServletResponse resp;
	
	@Override
	public void setServletResponse(HttpServletResponse response) {
		// TODO Auto-generated method stub
		this.resp=response;
	}
	@Override
	public void setServletRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		this.req=request;
	}
	/**
	 * 登录方法
	 * @return
	 */
	public String login() {
		if("xiao".equals(user.getUsername())&&"123".equals(user.getPassword())) {
			req.setAttribute("username", user.getUsername());
			return "success";
		}else {
			return "error";
		}
	}
	

	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;
	}

}

效果(目标效果都是一样的,只是方式不一样):
在这里插入图片描述
在这里插入图片描述

4.2.2 解耦方式(与非注入式的解耦方式一样,在此就不重复了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值