package com.struts2.demo1;
import java.net.URLEncoder;
publicclass HelloWord {
private Stringinfo;
private Stringusername;
public String getUserName() {
returnusername;
}
publicvoid setUserName(String userName) {
this.username = userName;
}
public String getInfo() {
returninfo;
}
public String execute()throws Throwable{
this.username=URLEncoder.encode("小龙","UTF-8");
this.info="Struts2第一个Demo";
return"success";
}
}
Strutst.xml下的文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="demo1" namespace="/test" extends="struts-default">
<action name="list" class="com.struts2.demo1.HelloWord" method="execute">
<!---这里是使用了动态的获取Action类中的属性值 -->
<result name="success" type="redirect">/employeeAdd.jsp?username=${UserName}</result>
</action>
<!--redirect重定向页面-->
<action name="redirect">
<result type="redirect">/employeeAdd.jsp</result>
</action>
<!-- redirectAction重定向本包中的Action-->
<!-- <action name="redirectAction">-->
<!-- <result type="redirectAction">list</result>-->
<!-- </action>-->
<!--redirectAction重定向到另一包中的Action-->
<action name="redirectAction">
<result type="redirectAction">
<param name="actionName">xxx</param>
<param name="namespace">/control</param>
</result>
</action>
</package>
<package name="other" namespace="/control" extends="struts-default">
<action name="xxx">
<result>/WEB-INF/page/hello.jsp</result>
</action>
</package>
</struts>
MyJsp.jsp文件
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>MyJsp.jsp</title>
</head>
<body>
${Info}aaaa
</body>
</html>
employeeAdd.jsp文件
<%@ page language="java" pageEncoding="UTF-8"%>
<%@page import="java.net.URLDecoder"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>employeeAdd.jsp</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<%=URLDecoder.decode(new String(request.getParameter("username").getBytes("ISO8859-1"),"UTF-8"),"UTF-8") %>
<form action="/xx">
姓名:<input type="text" name="name">
</form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
${Info}
</body>
</html>
访问 web 元素( Request 、 Session 、 Application )
最常用的方式:
Index.Jsp页面
<?xmlversion="1.0"encoding="GB18030"?>
<%@ page language="java"contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<% String context = request.getContextPath();%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=GB18030"/>
<title>Insert title here</title>
</head>
<body>
取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
<ol>
<li>前三者:依赖于容器</li>
<li>前三者:IOC</li> (只用这种)
<li>后三者:依赖于容器</li>
<li>后三者:IOC</li>
</ol>
<br/>
<formname="f"action=""method="post">
用户名:<inputtype="text"name="name"/>
密码:<inputtype="text"name="password"/>
<br/>
<inputtype="button"value="submit1"οnclick="javascript:document.f.action='login/login1';document.f.submit();"/>
<inputtype="button"value="submit2"οnclick="javascript:document.f.action='login/login2';document.f.submit();"/>
<inputtype="button"value="submit3"οnclick="javascript:document.f.action='login/login3';document.f.submit();"/>
<inputtype="button"value="submit4"οnclick="javascript:document.f.action='login/login4';document.f.submit();"/>
</form>
</body>
</html>
user_login_success.jsp
<?xmlversion="1.0"encoding="GB18030"?>
<%@ page language="java"contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@tagliburi="/struts-tags"prefix="s"%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=GB18030"/>
<title>Insert title here</title>
</head>
<body>
User Login Success!
<br/>
<s:propertyvalue="#request.r1"/> |<%=request.getAttribute("r1")%><br/>
<s:propertyvalue="#session.s1"/> |<%=session.getAttribute("s1")%><br/>
<s:propertyvalue="#application.a1"/> |<%=application.getAttribute("a1")%><br/>
<s:propertyvalue="#attr.a1"/><br/>
<s:propertyvalue="#attr.s1"/><br/>
<s:propertyvalue="#attr.r1"/><br/>
<s:debug></s:debug>
<br/>
</body>
</html>
Struts.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstruts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constantname="struts.devMode"value="true"/>
<packagename="login"extends="struts-default"namespace="/login">
<actionname="login*"class="com.bjsxt.struts2.user.action.LoginAction{1}">
<result>/user_login_success.jsp</result>
</action>
</package>
</struts>
LoginAction1.java
package com.bjsxt.struts2.user.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;
//以来容器来实现的ActionContext
public LoginAction1() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
}
LoginAction2.java最为常用的方法
package com.bjsxt.struts2.user.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;
//DI dependency injection== //IoC inverse of control()模式
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
LoginAction3.java
package com.bjsxt.struts2.user.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
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();
}
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
}
LoginAction4.java
package com.bjsxt.struts2.user.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction4 extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletContext();
}
}
数据的验证方法
Index.jsp
<?xmlversion="1.0"encoding="GB18030"?>
<%@ page language="java"contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=GB18030"/>
<basehref="<%=basePath%>"/>
<title>Insert title here</title>
</head>
<body>
使用addFieldError方法和s:fieldError标签简单处理数据校验
<ahref="user/user!add?name=adm">添加用户</a>
</body>
</html>
User_add_error.jsp
<?xmlversion="1.0"encoding="GB18030"?>
<%@ page language="java"contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@tagliburi="/struts-tags"prefix="s"%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=GB18030"/>
<title>Insert title here</title>
</head>
<body>
User Add Error!
<s:fielderrorfieldName="name"theme="simple"/>
<br/>
<!—获取错误的信息 -->
<s:propertyvalue="errors.name[1]"/><br/>
<s:propertyvalue="fieldErrors"/><br/>
<s:propertyvalue="errors.name[0]"/><br/>
<%--这里是显示debug信息--%>
<s:debug></s:debug>
</body>
</html>
Struts.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstruts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constantname="struts.devMode"value="true"/>
<packagename="user"extends="struts-default"namespace="/user">
<actionname="user"class="com.bjsxt.struts2.user.action.UserAction">
<resultname="success">/user_add_success.jsp</result>
<resultname="error">/user_add_error.jsp</result>
</action>
</package>
</struts>
UserAction.java
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
publicclassUserAction extends ActionSupport {
private Stringname;
public String add() {
if(name ==null || !name.equals("admin")) {
this.addFieldError("name","name is error");
this.addFieldError("name","name is too long");
returnERROR;
}
returnSUCCESS;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
}
Action中接受参数值为中文时出现乱码解决方案
Strutst.xml配置
<!--配置是是解决乱码 --> <constantname="struts.i18n.encoding"value="utf-8"/><!-- internationalization --> |
struts.xml每次更改内容可以不需要重启服务器的配置
<!-- 配置常量,为true为开发模式,表示struts.xml每次更改内容可以不需要重启服务器 --> <constantname="struts.devMode"value="true"/> |
ActionMethod(Action方法的调用)
Index.jsp
<?xmlversion="1.0"encoding="GB18030"?> <%@ page language="java"contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>
<% String context = request.getContextPath();%> <!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Type"content="text/html; charset=GB18030"/> <title>Insert title here</title> </head> <body> Action执行的时候并不一定要执行execute方法<br/> 可以在配置文件中配置Action的时候用method=来指定执行哪个方法 也可以在url地址中动态指定(动态方法调用DMI)(推荐)<br/> <ahref="<%=context%>/user/userAdd">添加用户</a> <br/> <ahref="<%=context%>/user/user!add">添加用户</a> <br/> 前者会产生太多的action,所以不推荐使用 </body> </html> |
Struts.xml
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEstruts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constantname="struts.devMode"value="true"/> <packagename="user"extends="struts-default"namespace="/user"> <actionname="userAdd"class="com.bjsxt.struts2.user.action.UserAction"method="add"> <result>/user_add_success.jsp</result> </action>
<actionname="user"class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package> </struts>
|
UserAction.java
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
publicclassUserAction extends ActionSupport { public String add() { returnSUCCESS; } } |
通配符的使用案例
Index.jsp
<?xmlversion="1.0"encoding="GB18030"?> <%@ page language="java"contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>
<% String context = request.getContextPath();%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Type"content="text/html; charset=GB18030"/> <title>Insert title here</title> </head> <body> 使用通配符,将配置量降到最低<br/> <ahref="<%=context%>/actions/Studentadd">添加学生</a> <ahref="<%=context%>/actions/Studentdelete">删除学生</a> <br/> 不过,一定要遵守"约定优于配置"的原则 <br/> <ahref="<%=context%>/actions/Teacher_add">添加老师</a> <ahref="<%=context%>/actions/Teacher_delete">删除老师</a> <ahref="<%=context%>/actions/Course_add">添加课程</a> <ahref="<%=context%>/actions/Course_delete">删除课程</a>
</body> </html> |
其它的jsp页面只是提示功能这里就不写了。
Struts.xml其核心也就是在这里配置,和jsp要按照一定的约束
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEstruts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <constantname="struts.devMode"value="true"/> <packagename="actions"extends="struts-default"namespace="/actions"> <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}"> <result>/Student{1}_success.jsp</result> </action>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}"> <result>/{1}_{2}_success.jsp</result> <!-- {0}_success.jsp --> </action> </package> </struts>
|
StudentAction.java
package com.bjsxt.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
publicclassStudentAction extends ActionSupport { public String add() { returnSUCCESS; } public String delete() { returnSUCCESS; } } |
TeacherAction.java
package com.bjsxt.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
publicclassTeacherAction extends ActionSupport { public String add() { returnSUCCESS; }
public String delete() { returnSUCCESS; } } |
Action中接收值的方式
1. DomainModelParamInput(该方式最常用)
使用Domain Model接收参数<ahref="user/user!add?user.name=a&user.age=8">添加用户</a> |
Action类的代码
package com.bjsxt.struts2.user.action; import com.bjsxt.struts2.user.model.User; import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport { private User user; //实体对象 //private UserDTO userDTO; public String add() { System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } |
2. ActionAttrParamInput、(该方式最常用)
使用action属性接收参数<ahref="user/user!add?name=a&age=8">添加用户</a>
|
Action类中的代码
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
publicclassUserAction extends ActionSupport { private Stringusername; privateintage;
public String add() { System.out.println("name=" +username); System.out.println("age=" +age); returnSUCCESS; } public String getName() { returnusername; } publicvoid setName(String name) { this.username = name; } publicint getAge() { returnage; } publicvoid setAge(int age) { this.age = age; } }
|
3. ModelDrivenParamInput
使用ModelDriven接收参数<ahref="user/user!add?name=a&age=8">添加用户</a> |
Action类中的代码
package com.bjsxt.struts2.user.action;
import com.bjsxt.struts2.user.model.User; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<User>{ private User user = new User();
public String add() { System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); return SUCCESS; } @Override public User getModel() { return user; }
} |
当访问莫页面不存在是可以用到
<?xmlversion=”1.0”encoding=”UTF-8”?> <!DOCTYPEstruts PUBLIC “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN” “http://struts.apache.org/dtds/struts-2.0.dtd”> <struts> <constantname=”struts.devMode”value=”true”/> <packagename=”default”namespace=”/”extends=”struts-default”> <default-action-ref name=”index”></default-action-ref> <actionname=”index”> <result>/default.jsp</result> </action> </package> </struts>
|
Action总结
Result配置
Struts.xml配置
普通配置
<struts> <constantname="struts.devMode"value="true"/> <packagename="resultTypes"namespace="/r"extends="struts-default"> <action name="r1"> <!--不写是默认的跳转,是服务器跳转forword,是跳转到页面的 --> <result type="dispatcher">/r1.jsp</result> </action> <action name="r2"> <!--只能是个重定向到页面的--> <result type="redirect">/r2.jsp</result> </action> <action name="r3"> <!-- forword跳转到另一个action --> <result type="chain">r1</result> </action> <action name="r4"> <!-- 客户端跳转到action--> <result type="redirectAction">r2</result> </action> </package> </struts> |
Index.jsp
<body> Result类型 <ol> <!--不写是默认的跳转,是服务器跳转forword,是跳转到页面的 --> <li><ahref="r/r1">dispatcher</a></li> <!--只能是个重定向到页面的--> <li><ahref="r/r2">redirect</a></li> <!-- forword跳转到另一个action --> <li><ahref="r/r3">chain</a></li> <!-- 客户端跳转--> <li><ahref="r/r4">redirectAction</a></li> <!-- --> <li>freemarker</li>
<li>httpheader</li> <!-- 下载用的--> <li>stream</li> <li>velocity</li> <li>xslt</li> <!--显示页面源文件--> <li>plaintext</li>
<li>tiles</li> </ol>
</body> |
全局结果集配置
Struts.xml
<struts> <constantname="struts.devMode"value="true"/> <packagename="user"namespace="/user"extends="struts-default"> <global-results> <result name="mainpage">/main.jsp</result> </global-results>
<actionname="index"> <result>/index.jsp</result> </action> <action name="user"class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_success.jsp</result> <result name="error">/user_error.jsp</result> </action> </package> <packagename="admin"namespace="/admin"extends="user"> <actionname="admin"class="com.bjsxt.struts2.user.action.AdminAction"> <result>/admin.jsp</result> </action> </package> </struts>
|
Jsp.xml
Result类型 <ol> <li><ahref="user/user?type=1">返回success</a></li> <li><ahref="user/user?type=2">返回error</a></li> <li><ahref="user/user?type=3">返回global result</a></li> <li><ahref="admin/admin">admin,继承user包</a></li> </ol> |