struts2框架(二)——表单处理三种方式、Action三种创建方式、动态方法调用等等

01 表单处理数据的三种方式

属性驱动

  • 使用struts2获取表单数据:只需要表单域名称和Action处理类的属性名称一致,并且提供属性的set方法,那么在action处理类中即可获得表单数据。
  • 如果数据需要显示到页面上:
    该数据可以作为处理类的属性,处理方法后,该属性有值,并且要提供该属性的get方法,那么在页面上可以直接通过el表达式获取
  • 案例演示
  1. 创建项目
  2. 导入jar包
  3. 编写web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5" >
	<filter>
		<filter-name>struts</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
  1. 编写LoginAction类
package com.rjxy.controller;

public class LoginAction{
	
	private String username;
	private String passwd;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public String execute() {
		if("joncy".equals(username) && "123".equals(passwd))
			return "success";
		else
			return "failure";
	}
}

  1. 编写核心配置文件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>
	<package name="default" namespace="/" extends="struts-default">
		<action name="login" method="execute" class="com.rjxy.controller.LoginAction">
			<result name="success">success.jsp</result>
			<result name="failure">userLogin.jsp</result>
		</action>
	</package>
</struts>
  1. 编写对应的成功页面
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>登录成功</title>
</head>
<body>
<h1>登录成功,${username }</h1>
</body>
</html>
  • 运行结果
    在这里插入图片描述
    在这里插入图片描述

对象驱动

  • 将其属性封装为对象(开发中用的最多)
  • 在Action的处理类中,属性以对象方式存在,该属性对象只需要声明即可,需要保证该属性有无参构造方法。在表单中的表单域名称属性对象名.属性 来命名。
  • 执行过程:当表单提交之后,struts框架发现是属性对象名.属性这种方式,就通过默认的无参构造方法反射创建User对象,并调用setUser方法赋值,然后读到.后面的username的时候,就用创建的对象调用setter方法给username赋值,passwd也是这样。action就可以继续执行了。而get方法使用来完成页面输出的,javabean导航不可缺少get方法
    在这里插入图片描述
  • 案例改进
  1. 将表单修改为属性对象名.属性
<form action="login" method="post">
		<label>用户名:</label>
		<input type="text" name="user.username" /><br/>
		<label>密 码:</label>
		<input type="password" name="user.passwd" /><br/>
		<input type="submit" value="点我登录"/>
</form>
  1. 封装属性为javabean
package com.rjxy.controller;

public class User {
	private String username;
	private String passwd;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		System.out.println("setUsername执行了");
		this.username = username;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		System.out.println("setPasswd执行了");
		this.passwd = passwd;
	}
}

package com.rjxy.controller;

public class LoginAction{	
	private User user;
	
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		System.out.println("setUser执行了");
		this.user = user;
	}

	public String execute() {
		System.out.println(user.getUsername());
		System.out.println(user.getPasswd());
		if("joncy".equals(user.getUsername()) && "123".equals(user.getPasswd()))
			return "success";
		else
			return "failure";
	}
}
  • 注意:
  1. 表单中属性对象名称必须和action中名称一毛一样。
    在这里插入图片描述
    在这里插入图片描述
  2. 这种方式可以接收多个对象
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

模型驱动

  • 需要实现ModelDriven接口,并且主动将对象创建好。之前是反射创建。
  • 页面直接写属性的对象即可。
  • 案例改进:
  1. 表单直接写属性即可
    在这里插入图片描述
  2. 实现ModelDriven接口
package com.rjxy.controller;

import com.opensymphony.xwork2.ModelDriven;

public class LoginAction implements ModelDriven<User>{

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		System.out.println("setUser执行了");
		this.user = user;
	}

	public String execute() {
		if("joncy".equals(user.getUsername()) && "123".equals(user.getPasswd()))
			return "success";
		else
			return "failure";
	}

	public User getModel() {
		// TODO Auto-generated method stub
		return user = new User();
	}
}

02 Action的三种创建方式

无侵入性实现(轻量级的体现)

  • 上面的案例就没有实现或继承struts框架的任何接口和类(ModelDriven除外),是这个方法的体现

实现Action接口(只规定了execute()及五个常量)

public interface Action {

    public static final String SUCCESS = "success";
    
    public static final String NONE = "none";
    
    public static final String ERROR = "error";

    public static final String INPUT = "input";

    public static final String LOGIN = "login";

    public String execute() throws Exception;

}

继承ActionSupport类(struts2经常使用)

  • 优点:提供了struts2框架的很多功能:校验、国际化、本地化

03 struts.xml配置进阶

常量配置

  • 扩展名 默认(action,)
    在这里插入图片描述
    在这里插入图片描述
    在struts.xml和jsp页面中做以下修改:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 中文乱码
    在这里插入图片描述
    i18n=internationalization,之所以这样写是因为i到n之间有18个字母

  • 开发模式(devMode=true,修改配置文件,可以重新加载),一般在tomcati的server.xml文件中配置的context中,决定了.java文件修改保存之后是否自动reload。如下:
    在这里插入图片描述
    而这种方式在web.xml这些配置文件被修改之后是不可能reload的,可以在struts.xml文件中配置以下内容:

    <constant name="struts.devMode" value="true" />
    
  • <include></include>:引入其他配置文件,在团队开发中使用

reuslt配置进阶

1. 动态result配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 全局result
  • 全局result是嵌套在global-results元素中,对当前包中所有action都起作用。
<struts>
<package name="default" namespace="/" extends="struts-default">
<global-results>
<result name="success">/okMessage.jsp</result>
</global-results>
<action name="createData" class="example.struts2.DataCurd" method="create"/>
<action name="deleteData" class="example.struts2.DataCurd" method="delete"/>
<action name="updateData" class="example.struts2.DataCurd" method="update"/>
<action name="retrieveData" class="example.struts2.DataCurd" method="retrieve"/>
</package> </struts> 

05 Struts2框架进阶

Action的配置文件存在的问题

  • 在struts配置文件中每个Action的处理方法都对应着一个action。如下图:
    在这里插入图片描述

三种优化方式

1. 动态方法调用
  • 在常量中开启动态方法调用
    在这里插入图片描述
  • 配置action,一个action处理类只需配置一次即可,不需要配置处理方法。
    在这里插入图片描述
  • 调用处理方法:ActionName!MethodName.action。
    在这里插入图片描述
2. 通配符配置

在这里插入图片描述

3. 注解
发布了84 篇原创文章 · 获赞 90 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42512488/article/details/90270317