我希望能够在Web应用程序中记录用户活动.我目前正在使用log4j,它适用于日志记录错误等,但我不确定最好的方法是记录用户,执行的servlet方法和方法参数.我正在使用spring security进行身份验证.
典型的servlet可能如下所示:
public class BankAccountServlet {
@RequestMapping("/deposit")
public void deposit(double amount) {
...
}
@RequestMapping("/checkBalance")
public double checkBalance() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
如果有两个用户,foo和bar,其中foo检查他的余额和酒吧存款两笔现金10.00和5.00.我希望日志看起来像:
01/01/1970 23:59:59 - foo - checkBalance
02/01/1970 23:59:59 - bar - deposit - 10.00
02/01/1970 23:59:59 - bar - deposit - 5.00
Run Code Online (Sandbox Code Playgroud)
如果有人能提供一些建议,我真的很感激他们的帮助.
我一直在阅读关于太阳蓝图的GenericDAO实现和Gavin King对Hibernate的使用.他似乎没有提到有关交易处理的任何事情:
public abstract class GenericHibernateDAO<T, ID extends Serializable> {
protected Session getSession() {
return HibernateUtil.getSessionFactory().getCurrentSession();
}
public T makePersistent(T entity) {
getSession().saveOrUpdate(entity);
return entity;
}
}
Run Code Online (Sandbox Code Playgroud)
我很困惑我应该把交易的开始/结束放在哪里.目前,他们在DAO内部扩展了这一点GenericHibernateDAO
public class FooHibernateDAO extends GenericHibernateDAO<Foo, Long> {
public Foo saveFoo(Foo foo) {
getSession().beginTransaction();
makePersistent(foo);
getSession().getTransaction().commit();
}
}
Run Code Online (Sandbox Code Playgroud)
是否应该由应用程序层中DAO的调用者管理事务处理?
我现在有一些查询耗时太长(300毫秒),因为数据库已经增长到几百万条记录.幸运的是,对我来说,查询不需要查看大部分数据,最新的100,000条记录就足够了,所以我的计划是维护一个包含最新100,000条记录的单独表格并针对此运行查询.如果有人对更好的方法有任何建议,这将是伟大的.我真正的问题是,如果查询确实需要针对历史数据运行,有哪些选项,下一步是什么?我想到的事情:
这些事情是否正确,还有其他选择吗?某些数据库提供程序是否具有比其他数据库提供程序更多的功能来处理这些问题,例如将特定的表/索引指定为完全在内存中?
对不起,我应该提到这个,我正在使用mysql.
我忘了在上面提到索引.到目前为止,索引是我唯一的改进来源.为了识别瓶颈,我一直在使用maatkit进行查询,以显示是否正在使用索引.
我知道我现在正在远离问题的目的,所以也许我应该再做一个.我的问题是EXPLAIN说查询需要10毫秒而不是300毫秒jprofiler报告.如果有人有任何建议我会非常感激.查询是:
select bv.*
from BerthVisit bv
inner join BerthVisitChainLinks on bv.berthVisitID = BerthVisitChainLinks.berthVisitID
inner join BerthVisitChain on BerthVisitChainLinks.berthVisitChainID = BerthVisitChain.berthVisitChainID
inner join BerthJourneyChains on BerthVisitChain.berthVisitChainID = BerthJourneyChains.berthVisitChainID
inner join BerthJourney on BerthJourneyChains.berthJourneyID = BerthJourney.berthJourneyID
inner join TDObjectBerthJourneyMap on BerthJourney.berthJourneyID = TDObjectBerthJourneyMap.berthJourneyID
inner join TDObject on TDObjectBerthJourneyMap.tdObjectID = TDObject.tdObjectID
where
BerthJourney.journeyType='A' and
bv.berthID=251860 and
TDObject.headcode='2L32' and
bv.depTime is null and
bv.arrTime > '2011-07-28 16:00:00'
Run Code Online (Sandbox Code Playgroud)
而输出来自EXPLAIN:
+----+-------------+-------------------------+-------------+---------------------------------------------+-------------------------+---------+------------------------------------------------+------+-------------------------------------------------------+
| id | select_type …Run Code Online (Sandbox Code Playgroud) 在服务层我有一个看起来像这样的类:
class MyService {
public doSomething() {
TelnetSession session = new TelnetSession();
session.open("username", "password");
session.execute("blah");
session.close();
}
}
Run Code Online (Sandbox Code Playgroud)
在许多类中,我必须声明并打开会话,然后在最后关闭它.我宁愿用注释做点什么,但我不知道从哪里开始.其他人如何做这样的事情:
class MyService {
@TelnetTransaction
public doSomething() {
session.execute("blah");
}
}
Run Code Online (Sandbox Code Playgroud)
使用@TelnetTransaction实例化注释的方法,打开并传入TelnetSession对象.
谢谢,
詹姆士
我想将消息从Java推送到WebSocket客户端.我已成功将js客户端发送到服务器并在2个js客户端上收到消息,因此客户端代码工作正常.
我的问题是,我想在Java应用程序中发生事件时发起发送.因此,例如,每次放置10个订单时,向所有订阅的客户端发送消息.这可能吗?
我当前的配置:
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/hello">
<websocket:sockjs/>
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/topic"/>
</websocket:message-broker>
@Controller
public class MessageController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting() throws Exception {
return new Greeting("Hello world");
}
}
Run Code Online (Sandbox Code Playgroud)
我希望能做的是这样的:
public class OrderManager {
@Autowired MessageController messageController;
int orderCount = 0;
public void processOrder(Order o) {
orderCount++;
if(orderCount % 10 == 0)
messageController.greeting();
}
}
Run Code Online (Sandbox Code Playgroud)
所有订阅的websocket客户端都会收到一条消息.
如何在jsp中从ModelMap访问对象,以便可以在其上调用方法?目前我收到此错误:
Syntax error on token "$", delete this token
Run Code Online (Sandbox Code Playgroud)
JSP
<body>
<% MenuWriter m = ${data.menus} %>
<%= m.getMenus()%>
</body>
Run Code Online (Sandbox Code Playgroud)
Java的
@Controller
@RequestMapping("/dashboard.htm")
@SessionAttributes("data")
public class DashBoardController {
@RequestMapping(method = RequestMethod.GET)
public String getPage(ModelMap model) {
String[] menus = { "user", "auth", "menu items", };
String[] files = { "menu", "item", "files", };
MenuWriter m = new MenuWriter(menus, files);
model.addAttribute("menus", m);
String[] atocs = { "array", "of", "String" };
model.addAttribute("user_atocs", atocs);
return "dashboard";
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个非常简单的Web服务,并且在使spring生成正确的wsdl时遇到一些困难.我已尽力复制本春季教程中的示例.如果有人知道我做错了什么,我真的很感激帮助.
本质上,有一个名为IncidentHeaderEndpoint的EndPoint(目前没有任何功能).我想调用客户端以下列形式发送xml请求:
<browseIncidents>
<responsibleManager>foo</responsibleManager>
</browseIncidents>
Run Code Online (Sandbox Code Playgroud)
我的EndPoint看起来像这样:
public class IncidentHeaderEndpoint extends AbstractJDomPayloadEndpoint {
XPath respMgrExpression;
public IncidentHeaderEndpoint() {
Namespace namespace = Namespace.getNamespace("trust-service", "http://act-informatics.co.uk/trust-service/schemas");
try {
respMgrExpression = XPath.newInstance("//trust-service:StartDate");
respMgrExpression.addNamespace(namespace);
} catch (JDOMException e) {
e.printStackTrace();
}
}
protected Element invokeInternal(Element request) throws Exception {
String respMgr = respMgrExpression.valueOf(request);
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
当我在tomcat中部署时,我收到以下警告:
14-Oct-2010 13:08:43 org.springframework.ws.wsdl.wsdl11.provider.DefaultMessagesProvider addMessages
WARNING: No messages were created, make sure the referenced schema(s) contain elements
14-Oct-2010 13:08:43 org.springframework.ws.wsdl.wsdl11.provider.AbstractPortTypesProvider createOperations
WARNING: No operations were created, make …Run Code Online (Sandbox Code Playgroud) 我想知道是否有人有使用3270协议检索数据的经验.到目前为止我的理解是:
我需要使用telnet连接到SNA服务器,发出命令,然后返回一些数据.我不确定这个连接是如何建立的,因为我读过标准的telnet连接不起作用.我还读到IBM有一个库可以提供帮助,但没有找到更多关于它的信息.
我假设返回的数据是一个1920字符的字符串,因为3278屏幕是80x24字符.我只需要将这些字符解析到适当的字段中.关于3270 protcol我读的越多,情况就越少 - 我在提供的Jagacy 3270 Java库试验文档中读到了属性在协议中标记的属性和属性之前的字符'A'理解是有更多的字符表示其他因素,例如字段是否可编辑.
我有理由相信我的想法太简单了.举个例子来看一个包含项目列表的屏幕 - 在24个可见行中的一个上按一个特殊键,向下钻取有关该行的更详细信息.
还有人建议我可以发出打印命令.这有一些积极的影响 - 如果返回的字符串的格式不是1920,因为它包含这些字符,例如'A'表示用户如何与终端交互,打印将根除这些.此外,它将不再需要翻阅大量数据.另一方面,我不知道如何从print命令中将数据检索回Java.
我目前无法访问SNA服务器,但有一些屏幕截图显示终端在获得连接后将会是什么样子,因此将开始解析.有这么多的假设,而不是很多关于数据看起来像什么的想法,我感到非常难过.有没有人知道这些系统可能会帮助我回到正轨?
我已经完成了一大堆工作来从Web服务中检索一些数据,但现在遇到了向它安排请求的问题,我不确定从哪里开始.
我收听事件的jms队列,收到事件后,我需要在一段时间后向Web服务发出请求.持续时间因事件属性而异.如果Web服务返回false,我需要继续计划请求,直到它返回true.
我在考虑在收到事件或错误响应时在队列上创建查找请求,但这似乎并不理想 - 我会不断消耗消息,检查时间以查看是否应该发出请求如果没有,就把它放回队列.
如果有人就如何实施这样的问题得到建议我真的很感激.
我有一些xml数据我试图解组成java对象,其中一个元素包含<br/>元素:
<details>
<para>
Line Number One
<br/>
Line Number Two
</para>
</details>
Run Code Online (Sandbox Code Playgroud)
在我的Details java对象中,我有:
class Details {
@XmlElement(name="para")
private List<String> paragraphs;
}
Run Code Online (Sandbox Code Playgroud)
问题是段落列表中唯一的元素是"第二行".有谁知道我怎么处理这个?