我需要写一个Servlet或者Filter类可以访问到org.apache.catalina.connector.Request对象,它被包裹在给我的servlet的RequestFacade对象.由于RequestFacade不是Request的子类,因此转换不起作用.
我需要这个的原因是因为我试图调用Request的setRequestedSessionId()方法,这显然不是Http servlet规范的一部分.我需要这样做的原因是因为会话ID以不同于JSESSIONID的名称包含在URL中.我无法更改参数的URL或名称,因此我尝试通过提取会话ID并调用Request.setRequestedSessionId()来将请求与正确的会话相关联.
其实我已经解决了使用阀子类的问题,而是因为据我所知,我需要安装在Tomcat /服务器/ classes目录下我的阀门,而不是子类,其余包装它的,我不喜欢使用阀我的webapp.如果有一种可移植的方式在不同的Servlet容器中执行此操作,那将是很好的,但目前我已经辞职,使这个特定于Tomcat.
这是工作的阀门代码:
public class SessionSetter extends ValveBase {
public void invoke( Request request, Response response ) throws IOException, ServletException {
String sessionId = request.getParameter( "whatever" );
request.setRequestedSessionId( sessionId );
}
Run Code Online (Sandbox Code Playgroud)
}
有没有办法在Servlet或Filter中做同样的事情?或者有没有办法在我的应用程序.war文件中打包Valve类?
我是一名经验丰富的Java程序员,但我是XCode和C++的新手,所以对于这个愚蠢的问题感到抱歉.
我正在XCode中编写一些需要实例化Java虚拟机的c ++代码.OS X Java插件中有一个名为JavaVM_GetJNIEnv()的方法,以及来自Sun/Oracle的源代码中的头文件,名为JavaVM.h,其中包含以下行:
// Gets the JNIEnv* associated with the Java VM, creating the JVM
// instance if necessary. Note that the implementation of this routine
// must be prepared for it to be called from more than one thread.
JNIEnv* JavaVM_GetJNIEnv();
Run Code Online (Sandbox Code Playgroud)
我将.h文件添加到我的XCode项目中,但我不知道如何链接到二进制文件.我想出了如何在链接器中强制加载,如下所示:
-force_load /System/Library/Java/Support/Deploy.bundle/Contents/Resources/JavaPlugin2_NPAPI.plugin/Contents/MacOS/JavaPlugin2_NPAPI
Run Code Online (Sandbox Code Playgroud)
(此文件是符号链接;真实路径为/System/Library/Java/Support/Deploy.bundle/Contents/Resources/JavaPlugin2_NPAPI.plugin/Contents/Resources/Java/libplugin2_npapi.jnilib)
但后来我收到此错误消息:
ld: in /System/Library/Java/Support/Deploy.bundle/Contents/Resources/JavaPlugin2_NPAPI.plugin/Contents/MacOS/JavaPlugin2_NPAPI, can't link with bundle (MH_BUNDLE) only dylibs (MH_DYLIB)
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何使用XCode链接到.jnilib文件中的代码?
我的产品安装程序使用pkgbuild和productbuild可以很好地工作。但是,现在我试图弄清楚如何使我的安装程序也可以充当卸载程序。通过修改我的distribution.xml文件,我可以为用户显示卸载选择,如下所示:
<choices-outline>
<line choice="install"/>
<line choice="uninstall"/>
</choices-outline>
<choice id="install" visible="true" title="Install" description="Installation description goes here">
<pkg-ref id="com.prosc.RemoteExecution.install.pkg">#installer.pkg</pkg-ref>
</choice>
<choice id="uninstall" visible="true" title="Uninstall" description="Uninstaller description goes here" start_selected="false">
<pkg-ref id="com.prosc.RemoteExecution.uninstall.pkg">#installer.pkg</pkg-ref>
</choice>
Run Code Online (Sandbox Code Playgroud)
但是,当他们选择卸载时,我需要安装后脚本以某种方式知道他们选择了哪种选择。我看不到安装后脚本知道的任何方式-环境变量中没有任何内容可以表明这一点,也没有包含在传递给我的脚本的参数中。
在我看来,我可以编写一个单独的卸载程序包,并使用其自己的单独的后安装脚本,然后将该程序包作为整个产品的一个组件包含在内,但这似乎需要大量额外的安装工作。
如果基于用户做出的安装选择存在细微的行为差异怎么办?我是否需要为每个选择单独制作包装组件?
有没有不需要额外组件包的好的解决方案,还是我应该单独制作单独的组件包以进行安装/卸载?
当我在JDBC连接属性中设置useLegacyDatetimeCode = false时,我收到以下错误消息:
java.sql.SQLException:服务器时区值'CET'表示多个时区.如果要使用时区支持,则必须配置服务器或JDBC驱动程序(通过serverTimezone配置属性)以使用更具体的时区值.'CET'映射的时区是:欧洲/地拉那,欧洲/安道尔,欧洲/维也纳,欧洲/明斯克,欧洲/布鲁塞尔,欧洲/索非亚,欧洲/布拉格,欧洲/哥本哈根,欧洲/塔林,欧洲/柏林,欧洲/直布罗陀,欧洲/雅典,欧洲/布达佩斯,欧洲/罗马,欧洲/里加,欧洲/瓦杜兹,欧洲/维尔纽斯,欧洲/卢森堡,欧洲/马耳他,欧洲/基希讷乌,欧洲/提拉斯波尔,欧洲/摩纳哥,欧洲/阿姆斯特丹,欧洲/奥斯陆,欧洲/华沙,欧洲/里斯本,欧洲/加里宁格勒,欧洲/马德里,欧洲/斯德哥尔摩,欧洲/苏黎世,欧洲/基辅,欧洲/乌日哥罗德,
我理解这条消息告诉我的是什么,但我不知道该怎么做.我无法知道MySQL服务器运行的时区(这是我的客户安装的软件,而且服务器不是由我管理的).
我需要将此属性设置为false以修复MySQL时区错误.
我是一位经验丰富的 Java/Tomcat 开发人员,第一次尝试使用 AngularJS。我对 npm、node、yeoman、bower 等不太了解。我按照教程下载了这些工具并创建了一个新的 AngularJS 项目。
我不记得所有的步骤,但关于创建 Angular 项目的部分是这样的:
npm install generator-angular
yo angular
Run Code Online (Sandbox Code Playgroud)
生成的空项目为 307.9 兆字节。
相比之下,从 IntelliJ 创建一个新的空 Tomcat 应用程序是 45 KB。
难道我做错了什么?如果不是,那么“轻量级”Angular 项目大数千倍似乎合理吗?
在MySQL中是否有办法执行单个SQL语句,该语句返回所选行以及结果行的计数?
我可以做这个:
SELECT COUNT(*) FROM BigTable WHERE firstname LIKE 'a%';
Run Code Online (Sandbox Code Playgroud)
这给了我一个带有计数的结果行(37,781).我可以得到这样的实际行数据:
SELECT firstname FROM BigTable WHERE firstname LIKE 'a%';
Run Code Online (Sandbox Code Playgroud)
它显示实际的37,781行.但是当我尝试将它们组合起来时,像这样:
SELECT firstname, COUNT(*) FROM BigTable WHERE firstname LIKE 'a%';
Run Code Online (Sandbox Code Playgroud)
我得到一行与第一行匹配查询,以及匹配查询的记录总数.
我想看到的是两列37,781行.第一列应包含每行的第一个名称,第二列应包含每行的数字"37,781".有没有办法编写查询来完成此任务?
有没有办法在HTTP请求方法/动词上有条件地进行重定向?我想将所有PROPFIND请求重定向到文档根目录,以便:
PROPFIND/HTTP/1.1
被重定向到/ MyApp/carddav /,但是
GET/HTTP/1.1
处理正常.我需要这样做的原因是因为OS X地址簿中的CardDAV实现总是希望能够在/处联系CardDAV服务器,并且我在/ MyApp/carddav /上使用Tomcat运行它.
理想情况下,这可以使用.htaccess文件来完成,用户可以简单地将其放入他们的Web服务器文档根目录,而不是修改httpd.conf文件,但我可以使用这两种方法.
我有一个需要打开多个JFrame的应用程序(它是一个日志查看器,有时您需要在单独的窗口中查看一堆日志来进行比较).
似乎JVM(OS X上的Java 8更新101)持有对JFrame的强引用,这阻止了它被垃圾收集,并最终导致抛出OutOfMemoryError.
若要查看该问题,请运行此问题,最大堆大小为200 MB.每次打开一个窗口时,它都会消耗50兆字节的RAM.打开三个窗口(使用150兆字节的RAM).然后关闭三个窗口(调用dispose),这将释放内存.然后尝试打开第四个窗口.抛出OutOfMemoryError,第四个窗口无法打开.
我已经看到了其他答案,说明在必要时会自动释放内存以避免耗尽,但这似乎并没有发生.
package com.prosc.swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
public class WindowLeakTest {
public static void main(String[] args) {
EventQueue.invokeLater( new Runnable() {
public void run() {
JFrame launcherWindow = new JFrame( "Launcher window" );
JButton launcherButton = new JButton( "Open new JFrame" );
launcherButton.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
JFrame subFrame = new JFrame( "Sub frame" ) {
private byte[] bigMemoryChunk = new byte[ …Run Code Online (Sandbox Code Playgroud) 我正在切换到Java 9(用于HTTP/2客户端,以及其他好处),但不打算使用Java 9模块化.
关于无法访问的软件包,我遇到了大量的编译器错误.每个都要求我添加一个额外的--add-exports modulename/packagename=ALL-UNNAMED编译器标志.
是否有一些编译器标志,我可以指定,一次,添加所有导出,而不是再得到编译器错误?
以下是显示问题的示例代码:
package com.prosc.fx;
import com.sun.javafx.stage.WindowHelper;
public class CompilerFlagTest {
public static void main(String[] args) {
WindowHelper.getWindowAccessor();
}
}
Run Code Online (Sandbox Code Playgroud)
错误消息是:
错误:(3,22)java:package com.sun.javafx.stage不可见(包com.sun.javafx.stage在模块javafx.graphics中声明,它不会将其导出到未命名的模块)
与仅具有自动缩放功能的EC2相比,我对于何时在EC2上使用ECS感到困惑。如果我有一个在EC2竞价型实例集群上运行的Tomcat Web应用程序,为什么要在每个EC2实例上的一堆小docker实例中细分CPU和RAM?