我想在我的Spring web.xml中定义两个servlet - 一个用于应用程序html/jsp页面,另一个用于将由外部应用程序调用的Web服务.这是web.xml:
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/user-service-servlet.xml</param-value>
</context-param>
<servlet>
<servlet-name>user-webservice</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>user-webservice</servlet-name>
<url-pattern>/UserService/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
如果我有myservlet自己在文件中使用DispatcherServlet,它工作正常.如果我的user-webservice带有context-param,它的配置文件(user-service-servlet.xml),它可以正常工作.但是,如果我在文件中都有,那么myservlet不起作用,因为myservlet-servlet.xml文件没有自动加载.如果我删除context-param,那么myservlet可以正常工作,但是user-webservice不能正常工作,因为它没有加载配置文件(user-service-servlet.xml).
如何定义两个servlet并加载它们的两个配置文件?
我有一个log4j appender定义如下:
log4j.logger.com.example = DEBUG, filelog
log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.filelog.File=c:/app.log
log4j.appender.filelog.layout=org.apache.log4j.PatternLayout
log4j.appender.filelog.layout.ConversionPattern=%d | %m%n
log4j.appender.filelog.DatePattern=.dd-MM-yyyy
Run Code Online (Sandbox Code Playgroud)
在我的班上,我得到了记录器:
Log logger = LogFactory.getLog(getClass());
Run Code Online (Sandbox Code Playgroud)
这工作正常.我希望有一个记录器,它总是记录某些消息(不是错误,而是事务所花费的时间).如果我在DEBUG或INFO中写这些,如果更改了日志级别,我将看不到它们.我想我可以使用写入同一文件的另一个appender来完成此操作.
这可能有两个appender写入同一个文件?我如何获得我想在同一个类中使用普通调试appender和事务性appender的logger实例?这些消息不会都在同一个包中,因此我无法将某个包配置为始终记录.我是否必须让这些appender写入不同的文件,或者我可以在代码中检索它们并具有以下内容:
Log alwaysLogger = LogFactory.getLog(ALWAYS);
alwaysLogger.debug("This message will always be written regardless of the level set on the filelog appender");
Run Code Online (Sandbox Code Playgroud)
更新 我可以根据需要写入两个不同的日志文件,但是如何在我的类中获取记录器实例?我不想将一个包/类配置为始终使用一个appender而不是另一个包,因为类必须在正常运行期间记录信息/错误消息和事务性"始终"消息.有没有办法完成我需要的东西,即使它写入两个不同的日志文件?
我在Spring Security配置中定义了自定义身份验证提供程序.这个类实现了AuthenticationProvider,我可以使用我页面上定义的表单成功登录.问题是我想要不仅在登录页面上调用此类,而且还要从注册页面调用此类.
注册页面使用不同的命令类,并收集比登录表单更多的信息.现在,当用户注册时,我调用适当的控制器,将记录添加到数据库,然后他们可以登录,但他们没有自动登录.由于他们刚刚在注册页面上给我他们的用户名/密码,我可以将其传递给自定义AuthenticationProvider类,以便他们也登录吗?
我已经尝试在注册控制器中创建一个org.springframework.security.Authentication类,并在我的客户AuthenticationProvider类上调用authenticate方法,这不会出错,但是用户没有登录.我是否必须在Spring Security过滤器链中调用更高的方法来完成此操作?我应该将控制器重定向到j_spring_security_check URL吗?如果是这样,我将如何传递用户名/密码?
在我的Spring应用程序中,我有一个jsp,它有一个表单,我希望有多个提交按钮转到同一个控制器.我需要能够确定控制器中按下了哪个按钮.表单向用户显示多个项目,他们可以选择其中一个项目,唯一的区别是所选项目的ID.
在jsp中,我正在创建这样的表单:
<form:form method="post" commandName="myCommand">
<c:forEach items="${model.availableitems}" var="item">
<span class="item">${item.description}</span>
<input type="hidden" name="id" value="${item.ID}"/>
<input type="submit" name="SelectButton" value="Select" />
</c:forEach>
</div>
</form:form>
Run Code Online (Sandbox Code Playgroud)
但是,这在日志中给出了"数据绑定错误:1"消息,并且表单未提交给控制器.
我尝试将myCommand.id从int更改为String,但是当它提交时的值是id1,id2,id3 ...(逗号分隔列表中的所有ID),无法确定按下了哪个按钮.我不希望必须为每个按钮指定不同的操作,因为项目的数量可以增长,并且它们的操作完全相同,只是使用不同的ID.
如何在此表单中使用多个按钮并获取控制器中的值?
说我有两个清单:
List<String>products = new ArrayList<String>();
products.add("computer");
products.add("phone");
products.add("mouse");
products.add("keyboard");
List<String>cart = new ArrayList<String>();
cart.add("phone");
cart.add("monitor");
Run Code Online (Sandbox Code Playgroud)
我需要找到产品列表中存在的购物车清单中有多少商品.对于上面的列表,答案是1(因为电话在产品和购物车中).如果购物车清单是:
List<String>cart = new ArrayList<String>();
cart.add("desk");
cart.add("chair");
Run Code Online (Sandbox Code Playgroud)
结果将是0.如果购物车包含计算机,鼠标,桌子,椅子,结果将是2(对于计算机和鼠标).
有什么东西在Apache的百科全书集合或谷歌集合API?我仔细查看过它们,看看如何计算行李数,但不是从另一个列表,尽管我可能会遗漏一些东西.现在,我能想到的唯一方法是迭代购物车商品,看看产品是否包含单个商品并保持计数.我不能使用containsAll,因为我需要count(不是布尔值),如果购物车中的所有商品都不存在于产品列表中(这可能会发生),那么这将失败.
如果重要的话,我正在使用Java 1.6.
我正在开发需要处理即将到期的航空里程的应用程序。可以使用里程,但是如果在某个日期之前未使用里程,它们将过期。我想确保我使适当的里程数过期,但是如果已经使用过,则不要使其过期。因此,我必须检查在给定的日期范围内是否使用了足够的里程,然后再终止里程。这是我最初的想法:
有一个包含以下各列的里程表:
miles_expire标志为true)miles_type设置为过期时适用如果每次从特定用户帐户添加,使用或过期里程时都有一条记录,我认为我可以这样计算过期里程:
miles_expire标记设置为true,expiration_date当前日期之前为,processed标记设置为false。这将获取应该过期的所有里程的记录。expiration_date从上一个查询中获取第一个和最后一个。expiration_date上一步中的第一个和最后一个值,获取该日期范围内所有已使用里程的列表。processed第一个和最后一个expiration_date范围内的所有记录的标志设置为true 。这些里程已过期或已被忽略。看来这符合以下要求:
我还需要考虑其他因素吗?这项工作会适当地使里程过期吗?
我有一个包含以下数据的表:
UserName | LastLogin
-------------------------------
User1 | 2010-10-25 10:05:47
User2 | 2010-10-23 11:10:27
User3 | 2010-10-12 05:39:34
User4 | 2010-10-20 12:22:11
User5 | 2010-09-17 08:41:05
Run Code Online (Sandbox Code Playgroud)
我希望能够运行查询以获取在过去3天,过去7天和过去21天内登录的人数(我知道这些数字会重叠).我知道我可以通过运行查询来获得每个特定值(语法可能不是100%正确):
SELECT COUNT(*)
FROM login
WHERE LastLogin >= DATEDIFF(NOW(), LastLogin, INTERVAL 3 DAY);
Run Code Online (Sandbox Code Playgroud)
我可以运行查询以在一个查询中返回所有三个值吗?GROUP BY是否可以工作,还是可以使用嵌套查询?使用指定的不同间隔运行查询三次是否同样有效?
我有一个Access表,其中包含两列(ID和Active),其数据如下所示:
ID | Active
------------
123 | 0
124 | 0
125 | 0
123 | 1
314 | 1
948 | 1
Run Code Online (Sandbox Code Playgroud)
我想选择具有唯一ID(仅存在一次,而不仅仅是第一次存在)的不同记录,但我还需要Active值.如果我做了
SELECT DISTINCT ID from table1
Run Code Online (Sandbox Code Playgroud)
我得到了唯一的ID,但不是表格.它还返回123表中不唯一的.如果我做:
SELECT DISTINCT * from table1
Run Code Online (Sandbox Code Playgroud)
如果它们具有不同的Active值,我会获得重复的ID.我需要一个查询来获取唯一ID及其相关的Sheet值.它将返回以下内容:
ID | Active
------------
124 | 0
125 | 0
314 | 1
948 | 1
Run Code Online (Sandbox Code Playgroud)
我是否需要将它们放入两个不同的表并进行外连接?活动只有0或1.