webx问题集_alvinice的博客-程序员宅基地

技术标签: Web  JSP  多线程  Servlet  Webx  Bean  

 1.方法修饰符不对出现的错误

com.alibaba.citrus.service.pipeline.PipelineException

Failed to invoke Valve[#2/3, level 3]: com.alibaba.citrus.turbine.pipeline.valve.PerformTemplateScreenValve#a28815:PerformTemplateScreenValve

caused by com.alibaba.citrus.service.mappingrule.MappingRuleException

com.alibaba.citrus.service.moduleloader.UnadaptableModuleException: Could not adapt object to module: type=screen, name=ViewUser, class=class com.alibaba.webx.tutorial1.register.module.screen.ViewUser

caused by com.alibaba.citrus.service.moduleloader.UnadaptableModuleException

Could not adapt object to module: type=screen, name=ViewUser, class=class com.alibaba.webx.tutorial1.register.module.screen.ViewUser

  • 首先检查配置是否错误;
  • 当配置没有错误时,可考虑出现在ViewUser程序里所要调用的方法是否是public方法,本例中即ViewUser里的excute方法。因为方法若为私有或者保护类型则会无法调用。

2.重定向时出现的问题

Exception Occurred

com.alibaba.citrus.service.pipeline.PipelineException

Failed to invoke Valve[#2/3, level 3]: com.alibaba.citrus.turbine.pipeline.valve.PerformTemplateScreenValve#287ca7:PerformTemplateScreenValve

caused by com.alibaba.citrus.webx.WebxException

Failed to execute screen: ViewUser

caused by java.lang.NullPointerException

No Message

  • 空值问题可能是外部重定向时,context无法共享造成的。 

3.运行.do时出现的错误

Exception Occurred

com.alibaba.citrus.service.pipeline.PipelineException

Failed to invoke Valve[#2/2, level 3]: com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve#2c390c:PerformScreenValve

caused by com.alibaba.citrus.webx.WebxException

Failed to load screen module: Register

caused by com.alibaba.citrus.service.moduleloader.ModuleNotFoundException

Could not find screen module: Register

 

  • 在管道设置不变的情况下,.do运行时可以没有action类,但一定要有screen类(若只有action类,在执行action类的时候进行重定向的情况除外),否则出现上述错误。
  • 当没有action参数的时候,会跳过action,直接运行screen类;
  • 管道流程:根据action参数 先找action类,然后screen类, 最后渲染screen模板等。 若没有screen类也没有设定action参数,则作为静态 直接找模板;
  • 渲染layout模板的时候,control类直接在layout模板里调用,然后再渲染control模板:

 

支持模板

$control.setTemplate("myControl.vm")

无模板

$control.setModule("myControl")

 

  • 管道设置如下:
<loop>
            <choose>
              
                <when>
                    <!-- 执行带模板的screen,默认有layout。 -->
                    <pl-conditions:target-extension-condition extension="null, vm, jsp" />                  
                    <performAction />
                    <performTemplateScreen />
                    <renderTemplate />
                    
                </when>
                
                <when>
                    <!-- 执行不带模板的screen,默认无layout。 -->
                    <pl-conditions:target-extension-condition extension="do" />
                    <performAction />
                    <performScreen />
                    
                </when>
                <otherwise>
                    <!-- 将控制交还给servlet engine。 -->
                    <exit />
                </otherwise>                
            </choose>
   
            <!-- 假如rundata.setRedirectTarget()内部重定向,被设置,则循环,否则退出循环。 -->
            <breakUnlessTargetRedirected />
            
          
        </loop>

 4.web应用根路径问题

<img src="$workshopContent.setContentPath("images/logo_webx.png")"/>
  •  这个images文件夹处于webapp下,原因如下:
public static void main(String[] args) throws Exception {
        Server server = new Server();

        SelectChannelConnector connector = new SelectChannelConnector();
        connector.setPort(80);
        server.addConnector(connector);
        
        WebAppContext context = new WebAppContext();

        context.setContextPath("/");
        context.setDescriptor("src/main/webapp/WEB-INF/web.xml");
        context.setResourceBase("src/main/webapp");//这里设置了基本路径

        server.setHandler(context);

        server.start();

    }

 

5.前台页面的跳转链接

οnclick="location='$workshopModule.setTarget("modifyUser.vm").addQueryData("id", $user.id)'"/>

 6.form的问题

  • 从form中取得group:
    每个form都可以包含一个或多个group。Group被定义在form.xml中。每个group都有一个唯一的名字。我们必须取得名为“register”的group,才能取得用户填写的数据。
  • 在group设置error字段后,在程序里往其里面设置信息的时候代码如下:
 Map params = ArrayUtil.toMap(new String[][] {
                                                 { "id", userId }
                                             });

                group.getField("error").setMessage("wrongIdOrPassword", params);

  


 7.pull服务的应用

  • Pull服务的设置:请注意,UserAuth对象应该是global作用域的 —— 因为它的所有方法都是static的,没有必要在每个请求中都创建该对象。这样,模板就可以访问$userAuth对象了。
  • 配置如下
<services:pull xmlns="http://www.alibaba.com/schema/services/pull/factories">
		<utils />
		<rundata-tool />
		<csrfToken />
		<form-tool />
		<control-tool />
		<uris-tool />
		<pull-factories:bean-tool id="userAuth" scope="global"
			class="com.alibaba.webx.tutorial1.util.UserAuth"/>
	</services:pull>
  •  UserAuth.java
package com.alibaba.webx.tutorial1.util;

import com.alibaba.webx.tutorial1.register.SiteUser;

public class UserAuth {
	private static final ThreadLocal<SiteUser> userHolder = new ThreadLocal<SiteUser>();

    public static void setLoginUser(SiteUser user) {
        userHolder.set(user);
    }

    public static SiteUser getLoginUser() {
        return (SiteUser) userHolder.get();
    }

    public static boolean isLoggedIn() {
        return getLoginUser() != null;
    }
    
  
}
  •  UserAuthVale.java
package com.alibaba.webx.tutorial1.util;

import static com.alibaba.citrus.turbine.util.TurbineUtil.getTurbineRunData;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.citrus.service.pipeline.PipelineContext;
import com.alibaba.citrus.service.pipeline.support.AbstractValve;
import com.alibaba.citrus.turbine.TurbineRunData;
import com.alibaba.webx.tutorial1.register.SiteUser;

public class UserAuthValve extends AbstractValve {
	@Autowired
	private HttpServletRequest request;
	
	private String action;

	public void setAction(String action) {
		this.action = action;
	}

	public void invoke(PipelineContext pipelineContext)
			throws Exception {
		  TurbineRunData rundata = getTurbineRunData(request);
		if (!"cleanup".equals(action)) {
			SiteUser user = (SiteUser) rundata.getRequest().getAttribute("loginUser");

			if (user != null) {
				UserAuth.setLoginUser(user);
				System.out.print("设置了user");
			}
		} else {
			UserAuth.setLoginUser(null);
			System.out.print("user为空");
		}
		pipelineContext.invokeNext();

	}

}
  •  这里采用ThreadLocal解决非线程安全问题;
  • 在模板里调用如下:
#if ($userAuth.loggedIn)
  <p>你好,$userAuth.loginUser.name</p>
#else
  <p>你好,世界!</p>
#end

 

8.webx里的多模块配置

<services:components >
			<services:component name="register" path="/register"></services:component>
			<services:component name="app1" path="/app1"></services:component>
		</services:components>

 

这样将就可以访问register模块了,url为:http://localhost:80/register/xxx.htm

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/alvinice/article/details/83889293

智能推荐

Nastya and Scoreboard CodeForces - 1341D(DFS+剪枝)_codeforces dfs 剪枝-程序员宅基地

Denis, who managed to buy flowers and sweets (you will learn about this story in the next task), went to a meeting with Nastya to invite her to become a couple. And so, they sit together in a cafe, ch..._codeforces dfs 剪枝

C++的内存分配_c的内存分配-程序员宅基地

一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的_c的内存分配

31岁大龄程序员竟然拿到了蚂蚁金服offer,竟然是熬夜吃透300道Java面试题手册-程序员宅基地

Java面试手册目录一、性能优化面试专栏1.1、tomcat性能优化整理1.2、JVM性能优化整理1.3、Mysql性能优化整理二、微服务架构面试专栏2.1、SpringCloud面试整理2.2、SpringBoot面试整理2.3、Dubbo面试整理三、并发编程高级面试专栏四、开源框架面试题专栏4.1、Spring面试整理4.2、SpringMVC面试整理4.3、MyBatis面试整理五、分...

[贴装专题] 基于halcon的拟合矩形边缘验证贴装精度_halcon拟合矩形-程序员宅基地

该方法是基于halcon平台,利用拟合矩形边缘求其中心的方法来计算出基板中心和Lid中心的像素偏差,在读取相机的标定文件,即像素当量,来最终计算出两矩形中心的实际贴装偏_halcon拟合矩形

《剑指offer》刷题记录汇总篇-程序员宅基地

《剑指offer》刷题汇总1 前言2 刷题网站3 刷题笔记汇总1 前言  最近啃了个把月的数据结构与算法,有点飘了,准备拿牛客网的剑指offer模块练练手,个人觉得自己刚入门(或许还没入),所以这篇博客比较适合想学习数据结构或者刚接触数据机构的新手朋友朋友们,当然,大佬们也可以看看,一是指导,二是差缺补漏。  刷题顺序即题目顺序,时间的话大概一周2 刷题网站点击直达:剑指offer3 刷题笔记汇总题号题目知识点JZ1二维数组中的查找数组、查找JZ2替换空格字

wildfly10 添加 mysql 数据源 (datasource)_widfly 详细datasources-程序员宅基地

wildfly10 添加 mysql 数据源(datasource)wildfly 添加datasource 有三种方式: 1. 通过web manange console 2. 通过 CLI 3. 直接修改xml文件这里只说明最简单的第一种方式和遇到的坑: 添加driver:step 1: 安装mysql-connector-java (可以通过 yum, zypper, apt-get_widfly 详细datasources

随便推点

Python练习——输入字符,统计空格、字母、数字和其他字符(条件循环、输入输出、格式化输出、计算方式)-程序员宅基地

#Python 练习实例17#题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。#程序分析:利用 while 或 for 语句,条件为输入的字符不为 ‘\n’。import string n=input("请输入一串字符串:\n")letters=0 space=0digit=0others=0for c in s: if c.isalpha():#判断字母 letters=letters+1 elif c.isspace():#判断空

Redis中Key中为什么要使用{}_redis {}-程序员宅基地

Redis集群介绍Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:自动分割数据到不..._redis {}

Mysql配置master-slave模式-程序员宅基地

Mysql配置master-slave模式 坏境:Mysql版本5.1.61,Ubuntu 11.04(64bit) Master:192.168.0.63 Slave:192.168.0.62 1. Master配置在主服务器上为从服务器建立一个用户:grant replication slave on *.* to 'backup'@'1

两台ORACLE之间配置OGG-未配置同步DDL_两台主机名相同会影响ogg吗?-程序员宅基地

环境 :数据库版本Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 VBOX虚拟机主机名、数据库实例、库名及IP规划:源主机IP:192.168.1.213 HOSTNAME:bys001.oel.com目标主机IP:192.168.1.213 HOSTNAME:bys2.oel.com实例名和数据库_两台主机名相同会影响ogg吗?

软件iic协议-程序员宅基地

软件IIC协议硬件连接时钟线:SCL线(外接4.7K欧姆的电阻)数据线:SDA线(外接4.7K欧姆的电阻)D0线:控制外设的地址SCL、SDA都有普通gpio口代替,通过控制gpio口的输入输出状态来模拟iic的读写过程,这就是软件iiciic的传输数据最高位400kHziic的时序图待机时:SDA线和SCL线都处于高电平启动条件:在·SCL为高电平的状态下,SDA有高电平转变为低电平(下降沿)void iic_start(void){ SDA_Write();_软件iic

Postman打开一直转圈圈_postman 一直转圈-程序员宅基地

步骤-:删除%appdata%目录下的postman文件就可以解决问题了这个文件夹是隐藏的,地址栏输入%appdata%进入此目录打开以后找到postman,然后删除(必须关闭运行的postman),删除成功后,重新启动即可使用..._postman 一直转圈