我有一个servlet,我希望使用Jetty以编程方式部署.servlet使用Spring,它的web.xml指向Spring上下文XML文件,正如您所期望的那样.
目前,我只是尝试Jetty文档中的示例代码,但使用自己的servlet:
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
context.addServlet(new ServletHolder(new BatchReceiver()),"/br/*");
server.start();
server.join();
Run Code Online (Sandbox Code Playgroud)
这导致以下异常:
2012-05-24 14:43:20.190:INFO:oejs.Server:jetty-8.1.3.v20120416
2012-05-24 14:43:20.266:WARN:/:unavailable
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
at org.springframework.web.context.support.WebApplicationContextUtils.getRequiredWebApplicationContext(WebApplicationContextUtils.java:84)
at com.spiffymap.sealog.server.servlet.BatchReceiver.init(BatchReceiver.java:126)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:492)
at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:312)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:778)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:258)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:699)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:90)
at org.eclipse.jetty.server.Server.doStart(Server.java:262)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at com.spiffymap.sealog.server.servlet.TestBatchReceiver.main(TestBatchReceiver.java:26)
2012-05-24 14:43:20.335:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080
Run Code Online (Sandbox Code Playgroud)
如何设置我的servlet以便Jetty知道它的web.xml和Spring上下文在哪里?
真的很感激任何帮助!
编辑
所以,显然我不需要web.xml但我确实需要将Jetty指向我的Spring上下文.我尝试过以下内容:
context.setInitParameter("contextConfigLocation", "classpath*:**/*Context.xml");
Run Code Online (Sandbox Code Playgroud)
但它不起作用(仍然产生相同的例外).我也尝试在ServletHolder上设置"contextConfigLocation"无济于事.
我正在使用GWT库(gwt-openlayers),它允许我创建一个包含任意HTML的地图弹出窗口,类似于谷歌地图.我需要这个HTML来包含一个GWT Button小部件.
我正在创建一些HTML元素,如下所示:
Element outerDiv = DOM.createDiv();
outerDiv.getStyle().setOverflow(Overflow.HIDDEN);
outerDiv.getStyle().setWidth(100, Unit.PCT);
outerDiv.appendChild(new HTML(mapPOI.getHtmlDetails()).getElement());
Button popupButton = new Button("View Property");
popupButton.getElement().getStyle().setFloat(com.google.gwt.dom.client.Style.Float.RIGHT);
outerDiv.appendChild(popupButton.getElement());
Run Code Online (Sandbox Code Playgroud)
然后我通过调用获取这些元素的源HTML
String src = outerDiv.toString();
Run Code Online (Sandbox Code Playgroud)
并将此html插入我的地图标记.现在我的地图标记显示内容确定,包括按钮.但是,该按钮不会响应任何事件!从我可以收集到的,这是因为从未调用onAttach()方法按钮.
有一个更好的方法吗?
谢谢,
乔恩
~~~~编辑~~~~
我现在正在尝试一种新方法,这似乎是接受其他类似帖子的公认方法.
首先,我正在创建我的div:
String divId = "popup-" + ref;
String innerHTML = "<div id=\"" +divId + "\"></div>";
Run Code Online (Sandbox Code Playgroud)
然后我将它添加到我的地图弹出窗口并显示它(将其添加到DOM).显示弹出窗口后,我按如下方式获取Element,并尝试在其周围包装HTMLPanel:
Element element = Document.get().getElementById(divId);
HTMLPanel popupHTML = HTMLPanel.wrap(element);
Run Code Online (Sandbox Code Playgroud)
我的div元素已成功检索.但是,HTMLPanel.wrap(element);没有完成.原因是wrap(..)调用RootPanel.detachOnWindowClose(Widget widget),包括以下断言:
assert !widgetsToDetach.contains(widget) : "detachOnUnload() called twice "
+ "for the same widget";
assert !isElementChildOfWidget(widget.getElement()) : "A widget …Run Code Online (Sandbox Code Playgroud) 我正在使用 Angular Material 表来显示用户列表,包括电子邮件、创建日期和角色。我的模板如下所示:
<table mat-table [dataSource]="dataSource" multiTemplateDataRows matSort matSortActive="email" matSortDirection="asc">
<ng-container matColumnDef="email">
<th mat-header-cell *matHeaderCellDef mat-sort-header>Email</th>
<td mat-cell *matCellDef="let user" class="user-email"><a [routerLink]="['/users', user.id]">{{user.email}}</a></td>
</ng-container>
<ng-container matColumnDef="created">
<th mat-header-cell *matHeaderCellDef mat-sort-header>Created</th>
<td mat-cell *matCellDef="let user">{{user.created | date: 'medium'}}</td>
</ng-container>
<ng-container matColumnDef="roles">
<th mat-header-cell *matHeaderCellDef mat-sort-header>Roles</th>
<td mat-cell *matCellDef="let user">{{user.roles.join(', ')}}</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let user; columns: displayedColumns;"
class="user-row">
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我有单元测试来确定数据是否加载到组件中,但是我还想测试数据是否在模板中正确呈现。为此,我尝试使用以下测试代码:
it('should display the users email', () => {
expect(component.users).toBe(testUsers);
fixture.detectChanges();
console.log(fixture.isStable()); // displays false
fixture.whenRenderingDone().then(() => …Run Code Online (Sandbox Code Playgroud) 我有一个具有以下 ngOnInit 函数的组件,该函数轮询服务方法以获取状态更新:
ngOnInit() {
interval(2000).pipe(
switchMap(() => this.dataService.getStatus())
).subscribe((result) => {
this.uploadStatus = result;
);
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下代码测试更新是否实际发生:
beforeEach(() => {
fixture = TestBed.createComponent(UploadComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should start checking for status updates', fakeAsync(() => {
const dataService = TestBed.get(DataService);
// Mock the getStatus function
spyOn(dataService, 'getStatus').and.returnValue(Observable.create().pipe(map(() => 'woo')));
// Should not be initialised yet
expect(component.uploadStatus).toBeUndefined();
tick(2000);
expect(component.uploadStatus).toBe('woo');
}));
Run Code Online (Sandbox Code Playgroud)
但component.uploadStatus始终为空。我应该如何测试这种类型的场景?理想情况下,我想随着时间的推移检查多次更新。
谢谢
angular ×2
unit-testing ×2
context.xml ×1
gwt ×1
html ×1
jasmine ×1
jetty ×1
rxjs ×1
servlets ×1
spring ×1