Struts的Action是采用的是多实例多线程设计,而不是像Servlet那样采用单实例多线程设计,因此在struts中,一个请求就对应一个Action对象,个对象之间的数据相互之间互不干扰。没接到一个新的请求,就产生一个新的Action对象,并对Action对象的各属性赋予默认初始值。之后再根据一定的规则调用set方法给各属性赋值,并根据一定规则调用get方法。也就是说,Action对象不是一开始就必须调用set方法的。本文重点讲Action对象调用set和get方法的规则:

1.get方法的调用规则

Action对象get方法的调用规则相对简单,因此先说get方法的调用规则。调用get方法方法是为了获取属性值,这一点不仅仅在struts中是这样,在任何java程序中,都是这样的。那么什么时候才需要一个Action对象的属性值呢?就目前本人探索和总结的结果来看,分为以下三种情况:

(一)、在Action请求转发到下一个Action时(即result的type属性为chain时),下一个Action有对应属性的set方法;

这种情况是为了传递数据,让数据跟着Action流程的流转而进入到下一个Action对象,因此是非常重要的。但是呢,这种传递不一定能达到想要的目的,意外出现在如果最初的http请求本身就有了对应的查询参数值,则目标Action会在获得了源Action的get值之后,再次去过的请求的查询参数值,并用这个值作为set方法的传入参数,在这种情况下,目标Filed的值还是http请求的查询参数值。

(二)、在struts.xml配置文件中引用了相应的Action属性;

这种情况其实是显式调用了get方法,所以一定会被调用,也没什么好说的。

(三)有对应的request.getAttribute(),且之前没有用过相应的request.setAttribute()。

这里说的request.getAttribute()一般出现在视图中,比如jsp的requestScope.filedName,或者显示的request.getAttribute() java 代码。

Action对象get方法调用的具体规则流程如下:

需要强调的是,只有在真正需要数据的时候,才会调用get方法,而不是在离开Action的时候。所以,在下一个Action的拦截器之后,到达Action时,上一个Action的get方法才被调用(因为这时需要给目标Action赋值了,而赋值需要值的来源,所以就要调用上一个Action的get方法以获得赋值的来源)。

还有需要强调的是,需要get方法时,总是调用最近Action对象的get方法,如果最近的Action没有get方法,则调用次近的,知道最开始的那个Action。

2.set方法的调用规则

Action对象set方法的调用规则相对于get方法来说比较复杂。同样,在任何java程序中,set方法都是为了给对象的属性赋值,因此,set方法的调用规则关乎到Action对象的数据是怎么获取的,因此显得尤为重要。

因为set方法是给Action对象数据赋值的,所以,要知道set方法的调用规则,首先要清楚Action对象的属性数据的来源有哪些。就本人目前探索和总结来看,Action对象的属性数据的来源有以下两类:(1)上一个Action的get方法、(2)http请求参数。这两类数据来源也就对应了set方法的调用规则。

(一)从源Action的get方法中获得

这种情况对应于get方法调用规则中的第一种情况,也是在Action转发时发生的,而且和get方法的第一种情况总是同时发生的,也就是说,这两张情况要么都发生,要么都不发生。两种情况共同完成Action对象的数据传递。

(二)从请求参数中来

如果有对应的请求参数值,则这种情况一定会发生,及时上一种情况已经发生过了。这样,如果源Action有对应的get方法,请求中也有对应的请求参数值(注意是getParameter到的值,而不是getAttribute到的值,Action是不能从request的Attribute中得到属性值的),则一个get方法会被调用两次,后面一次获取的是请求参数中的值,最终的属性值和请求参数一致。

set方法调用规则的流程如下:

测试用的代码如下:LoginAction是源Action,LoginAction2是目标Action。

 import com.opensymphony.xwork2.ActionSupport;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.struts2.ServletActionContext; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginAction2 extends ActionSupport{
private final Logger log = LogManager.getLogger(getClass());
private String username;
private String password;
private String usernameAndPassword;
private int age; public String getUsername() {
log.trace("getUsername is in invoked"); return username;
} public void setUsername(String username) {
log.trace("setUsername is in invoked"); this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getUsernameAndPassword() {
log.trace("getUsernameAndPassword is in invoked"); return usernameAndPassword;
} public void setUsernameAndPassword(String usernameAndPassword) {
log.trace("setUsernameAndPassword is in invoked"); this.usernameAndPassword = usernameAndPassword;
} @Override
public void validate() {
log.trace("validate is invoked");
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
System.out.println( request.getAttribute("age"));
} public int getAge() {
log.trace("getAge is invoked");
System.out.println("getAge: "+age); return 70;
} // public void setAge(int age) {
// log.trace("setAge is invoked");
// System.out.println("setAge: "+age);
// this.age = age;
// }
}
 package edu.whu.swe.learnstruts2;

 import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import edu.whu.swe.learnstruts2.service.LoginService;
import edu.whu.swe.learnstruts2.service.impl.LoginServiceImpl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.struts2.ServletActionContext; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginAction extends ActionSupport {
private final Logger log = LogManager.getLogger(getClass());
private String username;
private String password;
private String alianname;
private String othertest;
private int age; private final LoginService loginService = new LoginServiceImpl(); public String execute() throws Exception { if (!loginService.isLogin(username, password)) { return INPUT; }
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
// request.setAttribute("age", 22);
// this.age=22; /** 因为是使用的框架,所以重定向语句之后的代码依旧会执行,但是业务逻辑已经转到定向后的地方了 */
// ServletContext context =request.getSession().getServletContext();
// RequestDispatcher dispatcher=context.getRequestDispatcher("/usernameInvalide.jsp");
// System.out.println("print this before dispatcher");
// dispatcher.forward(request,response);
// System.out.println("print this after dispatcher");
// age+=1000; //
System.out.println("LoginAction is executed");
return SUCCESS; } public String getUsernameAndPassword() {
log.trace("getUsernameAndPassword is in invoked");
return username + password;
} public void setUsernameAndPassword(String usernameAndPassword) {
log.trace("setUsernameAndPassword is in invoked"); } public String getUsername() {
log.trace("getUsername is in invoked");
return username;
} public void setUsername(String username) {
log.trace("setUsername is in invoked");
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getAlianame() {
log.trace("getAlianame is in invoked"); return alianname;
} public void setAlianame(String alianname) {
log.trace("setAlianame is in invoked"); this.alianname = alianname;
} public String getOthertest() {
return othertest;
} public void setOthertest(String othertest) {
this.othertest = othertest;
} @Override
public void validate() {
log.trace("validate is invoked");
} public void setAge(int age) {
log.trace("setAge is invoked");
this.age = age + 33;
} public int getAge() {
log.trace("setAge is invoked");
return 55;
}
}

关键的struts.xml配置如下:

<action name="login1" class="edu.whu.swe.learnstruts2.LoginAction2">
<result name="success">/welcome.jsp</result>
</action> <action name="login" class="edu.whu.swe.learnstruts2.LoginAction">
<result name="success" type="chain">
<param name="actionName">login1</param>
<param name="namespace">/</param>
</result>
</action>

测试结果如下:

不输入age
2018-01-12 16:34:58.876 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked "
2018-01-12 16:34:58.877 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked "
LoginAction is executed
2018-01-12 16:34:58.877 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked "
2018-01-12 16:34:58.878 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked "
2018-01-12 16:34:58.878 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked "
2018-01-12 16:34:58.878 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:34:58.878 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked "
2018-01-12 16:34:58.879 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked "
2018-01-12 16:34:58.879 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:34:58.880 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked "
2018-01-12 16:34:58.883 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked "
2018-01-12 16:34:58.883 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked "
2018-01-12 16:34:58.884 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 输入了age
2018-01-12 16:35:36.356 TRACE edu.whu.swe.learnstruts2.LoginAction setAge - " setAge is invoked "
2018-01-12 16:35:36.356 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked "
2018-01-12 16:35:36.357 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked "
LoginAction is executed
2018-01-12 16:35:36.358 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked "
2018-01-12 16:35:36.358 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked "
2018-01-12 16:35:36.358 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked "
2018-01-12 16:35:36.359 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:35:36.359 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked "
2018-01-12 16:35:36.359 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked "
2018-01-12 16:35:36.360 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked "
2018-01-12 16:35:36.360 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:35:36.360 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked "
2018-01-12 16:35:36.363 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked "
2018-01-12 16:35:36.363 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked "
2018-01-12 16:35:36.363 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 没有age表单
2018-01-12 16:37:41.549 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked "
2018-01-12 16:37:41.591 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked "
LoginAction is executed
2018-01-12 16:37:41.610 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked "
2018-01-12 16:37:41.611 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked "
2018-01-12 16:37:41.611 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked "
2018-01-12 16:37:41.611 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:37:41.612 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked "
2018-01-12 16:37:41.612 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked "
2018-01-12 16:37:41.615 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:37:41.622 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked "
2018-01-12 16:37:41.741 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked "
2018-01-12 16:37:41.741 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked "
2018-01-12 16:37:41.742 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 没有age表单,在源Action有getAge{return age+55}和setAge{this.age=age+33},返回页面结果是:age:55
2018-01-12 16:47:33.884 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked "
2018-01-12 16:47:33.933 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked "
LoginAction is executed
2018-01-12 16:47:33.955 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked "
2018-01-12 16:47:33.955 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked "
2018-01-12 16:47:33.956 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked "
2018-01-12 16:47:33.956 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:47:33.956 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked "
2018-01-12 16:47:33.957 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked "
2018-01-12 16:47:33.960 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:47:33.971 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked "
2018-01-12 16:47:34.132 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked "
2018-01-12 16:47:34.133 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked "
2018-01-12 16:47:34.134 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 输入age表单值为666,在源Action有getAge{return age+55}和setAge{this.age=age+33},在目标Action中打印相应的Filed。返回页面结果是:age:22
2018-01-12 17:19:51.730 TRACE edu.whu.swe.learnstruts2.LoginAction setAge - " setAge is invoked "
2018-01-12 17:19:51.731 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked "
2018-01-12 17:19:51.731 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked "
LoginAction is executed
2018-01-12 17:19:51.734 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked "
2018-01-12 17:19:51.734 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked "
setAge: 754
2018-01-12 17:19:51.735 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked "
2018-01-12 17:19:51.736 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 17:19:51.736 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked "
2018-01-12 17:19:51.736 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked "
2018-01-12 17:19:51.737 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked "
setAge: 666
2018-01-12 17:19:51.737 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 17:19:51.738 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked "
2018-01-12 17:19:51.741 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked "
2018-01-12 17:19:51.741 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked "
getAge: 666
2018-01-12 17:19:51.742 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 输入age表单值为666,在源Action有getAge{return age+55}和setAge{this.age=age+33},设置setAttribute("age",22);在目标Action中打印相应的Filed。返回页面结果是:age:22
2018-01-12 16:56:50.179 TRACE edu.whu.swe.learnstruts2.LoginAction setAge - " setAge is invoked "
2018-01-12 16:56:50.195 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked "
2018-01-12 16:56:50.229 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked "
LoginAction is executed
2018-01-12 16:56:50.249 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked "
2018-01-12 16:56:50.250 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked "
setAge: 754
2018-01-12 16:56:50.250 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked "
2018-01-12 16:56:50.250 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:56:50.251 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked "
2018-01-12 16:56:50.251 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked "
2018-01-12 16:56:50.253 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked "
setAge: 666
2018-01-12 16:56:50.255 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked "
2018-01-12 16:56:50.263 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked "
2018-01-12 16:56:50.414 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked "
2018-01-12 16:56:50.415 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked "

Struts2中Action对象的set方法和get方法调用规则的更多相关文章

  1. JS中Date对象getYear()方法和getFullYear()方法区别

    释义 JavaScript getFullYear() 方法 getFullYear() 方法可返回一个表示年份的 4 位数字. getYear() 语法 dateObject.getFullYear ...

  2. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

  3. 转载 Struts2之------Action类中的get,set方法和execute方法的使用规范和使用流程(规范是没有理由的,必须遵守!!!)

    1,Action中get,set方法的使用流程? 前台form中有一个<input type="text" name="username"/> 如果 ...

  4. Java中使用BufferedReader的readLine()方法和read()方法来读取文件内容

    目标:读文件 编程时,有很多时候需要读取本地文件,下面介绍一下读取方式: 读单行文件 package com; import java.io.*; import java.util.ArrayList ...

  5. Android中Path类的lineTo方法和quadTo方法画线的区别

    转载:http://blog.csdn.net/stevenhu_223/article/details/9229337 当我们需要在屏幕上形成画线时,Path类的应用是必不可少的,而Path类的li ...

  6. Hibernate中为什么要重写equals方法和hashcode方法

    1.*为什么要重写equals方法,首先我们来看一下equals源码: public boolean equals(Object anObject) { if (this == anObject) { ...

  7. Python中Pickle模块的dump()方法和load()方法

    Python中的Pickle模块实现了基本的数据序列与反序列化. 经常遇到在Python程序运行中得到了一些字符串.列表.字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就 ...

  8. Hibernate中session回话的get方法和load方法的区别

    1.报错方式不同: 前提:获取的数据不存在 get方法会报异常:空指针异常 load方法会报异常:对象为找到异常,给定值没有行存在. 2.load方法 这种方式总是会返回一个代理而不是真正得去查询数据 ...

  9. Struts2中action接收中文参数为乱码解决方法

    老实说,中文乱码问题是每个程序员会经常遇到的问题,而且也是一个很头疼的问题.网上很多关于解决中文乱码的帖子,看几个之后你会发现大都是一样的.但是我们照着做,却还是无法解决乱码问题.我也是看了好多帖子, ...

随机推荐

  1. NET上传大文件出现网页无法显示的问题 默认的上传文件大小是4M

    需要在配置文件处进行修改 web.config中的<system.web></system.web>内加入如下代码: <httpRuntime executionTime ...

  2. 以太坊系列之三: 以太坊的crypto模块--以太坊源码学习

    以太坊的crypto模块 该模块分为两个部分一个是实现sha3,一个是实现secp256k1(这也是比特币中使用的签名算法). 需要说明的是secp256k1有两种实现方式,一种是依赖libsecp2 ...

  3. 「HNOI2013」切糕

    题目链接 戳我 \(Solution\) 对于这道题,我们首先来看看没有\(D\)这个约束的该如何做. 我们考虑构造最小割模型. 其实直接贪心就好了,选出每条路径上的最小值就好了(路径就是将每层的同一 ...

  4. NSEnumerator迭代器

    前言 Xcode 7 对系统中常用的一系列容器类型都增加了泛型支持(),有了泛型后就可以指定容器类中对象的类型了. 假如向泛型容器中加入错误的对象,编译器会报警告. __covariant:协变性,子 ...

  5. 【ARC074F】Lotus Leaves 最小割

    Description 给你一个n*m网格图,有起点荷叶和终点荷叶,有中转荷叶,其他的格子没东西,一个荷叶可以跳到同一行或者列的另一个荷叶.问最多删掉几个中转荷叶能让起点终点不连通.如果不行输出-1. ...

  6. 洛谷P4724 【模板】三维凸包

    题面 传送门 题解 先理一下关于立体几何的基本芝士好了--顺便全都是从\(xzy\)巨巨的博客上抄来的 加减 三维向量加减和二维向量一样 模长 \(|a|=\sqrt{x^2+y^2+z^2}\) 点 ...

  7. CF914E Palindromes in a Tree

    $ \color{#0066ff}{ 题目描述 }$ 给你一颗 n 个顶点的树(连通无环图).顶点从 1 到 n 编号,并且每个顶点对应一个在'a'到't'的字母. 树上的一条路径是回文是指至少有一个 ...

  8. 【离散数学】 SDUT OJ 传递闭包 && memset 使用注意事项

    传递闭包 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 已知有n头牛,m次战斗关系, ...

  9. [JSOI2007]麻将 模拟 BZOJ1028

    题目描述 麻将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西.北.中.发.白七种)和序数牌(分为条子.饼子.万子三种花色,每种花色各有一到九的九种牌),每种牌各四张. 在麻将中,通常 ...

  10. python用字典实现switch..case类似的函数调用

    python中没有swich..case,若要实现一样的功能,又不想用if..elif来实现,可以充分利用字典进行实现 主要是想要通过不同的key调用不同的方法,在学习过程中,发现不管输入的key是什 ...