表单提交有中文尽量使用post
<constant name="struts.i18n.encoding" value="GBK"/> 这是一个bug
<filter-class>org.apache.struts2.dispatcher.FileterDispatcher</filter-class> web.xml 说可以解决不过我没有试出来就没做了,用spring 解决乱码安全
package com.demo.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String name;
public String add() {
System.out.println("name = " + name);
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
body>
使用action 属性接收参数,测试中文问题
<form action="user/user!add" method="post">
姓名:<input type="text" name="name"></input>
<input type="submit" value="submit"/>
</form>
</body>
数据校验
package com.demo.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String name;
public String add () {
if(name == null || !name.equals("admin")) {
this.addFieldError("name", "name is error");
// this.addFieldError("name", "name is long");
return ERROR;
}
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<body>
使用addFiledError 方法和s:filedError 标签简单处理数据校验
<a href="user/user!add?name=a">添加用户</a>
</body>
<body>
User Add Error!
<s:fielderror fieldName="name" theme="simple"/>
<br />
<s:property value="errors.name[0]"/>
<s:debug></s:debug>
</body>
context 把他看成周围的环境
例如: servletContext 即servlet 周围的环境 actionContext 即action周围的环境 及里面执行的过程或者一些东西
package com.demo.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction1 extends ActionSupport{
private Map request;
private Map session;
private Map application;
public LoginAction1 () {
request = (Map) ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
@Override
public String execute() throws Exception {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
}
// IOC 控制反转 常用这种方式
package com.demo.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
private Map<String,Object> request;
private Map<String,Object> session;
private Map<String,Object> application;
@Override
public String execute() throws Exception {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
public void setRequest(Map<String, Object> request) {
this.request = request;
}
public void setSession(Map<String, Object> session) {
this.session = session;
}
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
package com.demo.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction3 extends ActionSupport{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public LoginAction3 () {
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
}
@Override
public String execute() throws Exception {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
}
package com.demo.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction4 extends ActionSupport implements ServletRequestAware{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
@Override
public String execute() throws Exception {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletContext();
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<package name="login" extends="struts-default" namespace="/login">
<action name="login*" class="com.demo.action.LoginAction{1}">
<result>
/user_login_success.jsp
</result>
</action>
</package>
</struts>
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<% String context = request.getContextPath(); %>
<html>
<head>
</head>
<body>
取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
<ol>
<li>前三者: 依赖于容器</li>
<li>前三者:IOC</li>(只有这种)
<li>后三者: 依赖于容器</li>
<li>后三者: IOC</li><br/>
<form name="f" action="" method="post">
用户名: <input type="text" name="name"/>
密码: <input type="text" name="password"/><br/>
<input type="button" value="submit1" οnclick="javascript:document.f.action='login/login1';document.f.submit();"/>
<input type="button" value="submit2" οnclick="javascript:document.f.action='login/login2';document.f.submit();"/>
<input type="button" value="submit3" οnclick="javascript:document.f.action='login/login3';document.f.submit();"/>
<input type="button" value="submit4" οnclick="javascript:document.f.action='login/login4';document.f.submit();"/>
</form>
</ol>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
</head>
<body>
User Login Success ! <br/>
<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
<s:property value="#attr.a1"/><br>
<s:property value="#attr.s1"/><br/>
<s:property value="#attr.r1"/><br/>
<s:debug></s:debug>
</body>
</html>
loginaction2
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="login" extends="struts=default" namespace="/login"> <action name="login*" class="com.demo.action.LoginAction{1}"> <result>/user_login_success.jsp</result> </action> </package> </struts>
把login.xml 文件包含到struts.xml 里面来<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true"/> <include file="login.xml"></include> </struts>
方便分成模块,便于开发<include file="login.xml"></include>
<constant name="struts.devMode" value="true"/> <package name="front" extends="struts-default" namespace="/"> <default-action-ref name="index"></default-action-ref> <action name="index"> <result> /default.jsp </result> </action> </package>
<default-action-ref name="index"></default-action-ref> 如果访问不存在便 默认以index.action 为主