我将构建一个Web应用程序,我想使用URL重写.在apache中,这是使用mod_rewrite完成的.但是如何用Tomcat 6重写网址呢?
我想使用Struts 2框架.
我目前正在学习Struts 2,目前我正在构建一个简单的应用程序,其中未经验证的用户被重定向到登录表单.
我有一个登录表单和操作功能,它获取用户凭据,验证它们并在会话中存储User对象但是我现在试图阻止在登录之前访问页面并且我试图用拦截器执行此操作.
我的问题是我编写了一个拦截器,用于检查User对象是否已保存在会话中,但如果没有,我想重定向到登录页面,并且无法绕过struts并使用HttpServletResponse.sendRedirect方法
组态:
<package name="mypackage" extends="struts-default" namespace="/admin">
<interceptors>
<interceptor name="login" class="my.LoginInterceptor" />
</interceptors>
<default-interceptor-ref name="login"/>
<action name="login" class="my.LoginAction">
<result name="input">/admin/login.jsp</result>
<result name="success" type="redirect">/admin</result>
</action>
<action name="private" class="my.PrivateAction">
<result>/admin/private.jsp</result>
</action>
</package>
Run Code Online (Sandbox Code Playgroud)
拦截器代码:
@Override
public String intercept(ActionInvocation inv) throws Exception {
Map<String, Object> session = inv.getInvocationContext().getSession();
Object user = session.get("user");
if(user == null) {
// redirect to the 'login' action here
}
else {
return inv.invoke();
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下(缩短)struts2动作:
public class MyAction extends BaseAction implements CookiesAware {
public String execute() {
if (cookiesMap.containsKey("BLAH"))
blah=Integer.parseInt(cookiesMap.get("BLAH"));
return "success";
}
// For handling cookies
Map<String, String> cookiesMap;
@Override
public void setCookiesMap(Map<String, String> cookiesMap) {
this.cookiesMap = cookiesMap;
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行'cookiesMap.containsKey'时,我得到一个空指针异常 - 在我看来,没有调用setCookiesMap.我已经实现了CookiesAware界面,所以我认为它应该被调用 - 我错过了什么吗?
谢谢
我创建了一个Web应用程序, 如果有用户会话,我需要维护会话,然后只有这样才能让用户看到jsp.
我之前使用过jsp servlet,但我是struts2的新手.
这里我在我的动作类中设置用户名:
修订后的守则
private HttpSession session;
public void setSession(HttpSession session) {
// TODO Auto-generated method stub0
this.session = session;
}
public HttpSession getSession() {
return session;
}
public String getLoginStatus(){
session = request.getSession();
session.setAttribute("userName", loginBean.getUsername());
return SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在操作后重定向到下一页时,它会显示一次会话值.之后,在每个页面上,我在会话中找到空值.
<%
String userName = (String)session.getAttribute("userName");
System.out.println(userName);
if(userName == null || userName.equals("") ){
response.sendRedirect("login.jsp");
}
%>
Run Code Online (Sandbox Code Playgroud)
我在某处读到动作类会话的范围仅限于一页 - 我该如何解决这个问题?
任何例子都对我很有帮助.
在Struts 2中是否可以使用标记迭代枚举<s:iterator>?现在我正在使用String列表,但是可以直接使用枚举吗?
提前致谢.
我想将JSON反序列化(绑定)到java对象.如何在Struts2中做到这一点?
我正在尝试使用struts2-json-plugin,你可以在下面的代码中看到,但是从前端发送的JSON没有绑定到我的java对象.你能帮我吗,请问如何使这段代码正常工作?
请看一下我的Action类,我不确定我是否在这个Action中正确处理JSON,或者我错过了什么?
我试图绑定的JSON:
{"data":[
{"active":true,"color":"orange","date":"2008-01-01","id":1,"name":"Chris"},
{"active":false,"color":"blue","date":"2013-03-03","id":2,"name":"Kate"},
{"active":true,"color":"black","date":"2013-05-03","id":3,"name":"Blade"},
{"active":false,"color":"yellow","date":"2013-01-01","id":4,"name":"Zack"}]
}
Run Code Online (Sandbox Code Playgroud)
通过Ajax发送JSON:
$.ajax({
url: "../json/saveJSONDataAction.action",
data: {"data": handsontable.getData()}, //returns all cells' data
dataType: 'json',
type: 'POST',
success: function (res) {
if (res.result === 'ok') {
$console.text('Data saved');
}
}
});
Run Code Online (Sandbox Code Playgroud)
在Struts2中接收JSON:
我可以在调试中使用execute()方法,但不幸的data是,该字段始终为null.我应该怎么做才能使这个字段充满JSON的数据?JSON的格式是否正确绑定到List<Report> data?
@ParentPackage("json-default")
@Action(value="saveJSONDataAction")
@Result(type="json")
public class JSONSaveAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private List<Report> data;
public JSONSaveAction(){
}
public String execute() {
try {
System.out.println(data);
} catch (Exception e) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用set标签在Struts2中创建一个动态变量
<s:set var="myNum" value="numConst" />
<s:set var="number" value="%{getText('@xxx.CommonConstant@'+#myNum)}" />
Run Code Online (Sandbox Code Playgroud)
numConst将返回从数据库中检索的动态值.例如,如果值为NINE则应为数字@xxx.CommonConstant@NINE
我已经在我的java类中设置了值,以便@xxx.CommonConstant@NINE返回9.
到目前为止,如果我使用的话,可以在文本标签中显示该值没有问题
<s:text name="%{getText(#number)}" />
Run Code Online (Sandbox Code Playgroud)
9当我尝试使用属性标记时,它会返回但显示不正确
<s:property value="%{getText(#number)}" />
<s:property value="%{#number}" />
<s:property value="#number" />
<s:property value="%{getText('%{getText(#number)}')}" />
Run Code Online (Sandbox Code Playgroud)
以上所有的例子都会给我价值@xxx.CommonConstant@NINE.我尝试从属性标记中获取值的原因是因为我想要复制正确的方法来显示值,以便我可以在if标签中使用它们,如下例所示:
<s:if test="#number == 9">
do something
</s:if>
Run Code Online (Sandbox Code Playgroud)
要么
<s:if test="%{getText(#number)} == 9">
do something
</s:if>
Run Code Online (Sandbox Code Playgroud)
CommonConstant:
package xxx;
public abstract class CommonConstant {
public static final int NINE = 9;
public static final int NINEONE = 91;
public static final double ADMIN_PGM …Run Code Online (Sandbox Code Playgroud) 我的问题是,最好的方法是跟踪应用程序管理员的异常.(出于维护目的,通知管理员抛出的异常).
对于系统用户,我认为应该捕获异常并显示相应的错误消息. 我认为,对于系统管理员来说,最好的方法是让消息系统将每个异常的详细信息作为消息发送给接收方.一旦接收方收到新的错误消息,它就会在数据库中持续显示,或者向管理员发送一封包含异常详细信息的电子邮件.
try{
....
}
catch(Exception e){
//what to do here? how to notify admin?
}
Run Code Online (Sandbox Code Playgroud) 我用a <iframe>来显示文本文件:
<div class="document-view">
<img src="img/302.GIF" />
</div>
$(window).load(function () {
<s:if test="extention.equalsIgnoreCase('txt')">
element = '<iframe class="iframe" src="/dmsrepo/<s:property value="docLocation"/>" />';
</s:if>
$('.document-view').html(element);
});
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中检查元素时,我可以看到文件位置.
<iframe class="iframe" src="/dmsrepo/Legal Doc Type/LegalDocType_123456789_1.0.txt" />
Run Code Online (Sandbox Code Playgroud)
但是文本文件正在Chrome,Firefox和IE中下载.
如何解决这个问题?
编辑:你可以重现以下小提琴中的行为,这只会奇怪地影响Firefox,因为第一个页面加载后的每个页面加载.
只需打开页面,然后按Run.
注意:如果激活Firebug Net模块,它也会影响第一次加载.