首页 > 代码库 > strits2初始配置总结
strits2初始配置总结
********************************************************************************************************************
struts2第一天课程的简单配置:
新建 Web Project后导入Struts2.jar包,在struts-2.3.16.3-all.zip\struts-2.3.16.3\apps下找到struts2-blank.war,打开之后找到struts2-blank.war\WEB-INF\lib下的13个jar包.
再找到struts2-blank.war\WEB-INF\src\java下的struts.xml文件。
配置好jar包和xml文件之后:
配置web.xml里的过滤器:/*代表过滤所有
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
我的xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="http://www.mamicode.com/false" />
<constant name="struts.devMode" value="http://www.mamicode.com/true" />
<package name="default" namespace="/" extends="struts-default">
<action name="helloWorld" class="cn.jbit.action.HelloWorldAction" >
<result name="success">index.jsp</result>
</action>
<action name="userLogin" class="cn.jbit.action.LoginAction" >
<result name="success">success.jsp</result>
<result name="error">false.jsp</result>
<result name="input">index.jsp</result>
</action>
</package>
</struts>
我的index.jsp:
<form action="userLogin.action" method="post">
请输入用户名:<input type="text" name="username">
请输入密码:<input type="text" name="pwd">
<input type="submit" value="http://www.mamicode.com/提交">
</form>
我的action:
package cn.jbit.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;
private String messages;
@Override
public String execute() throws Exception {
name="wangyajie";
messages="Hellow,"+name;
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessages() {
return messages;
}
public void setMessages(String messages) {
this.messages = messages;
}
}
package cn.jbit.action;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.components.ActionComponent;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport implements SessionAware {
private static final long serialVersionUID = 1L;
public static final String SESSION_USER="user";
private String username="";
private String pwd="";
private Map<String, Object> session;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String execute() throws Exception {
if("jbit".equals(username)&&pwd.equals("bdqn")){
//第一种方式获取jsp的session,带作用域的session 解耦servlet
// Map<String, Object> session = ActionContext.getContext().getSession();
// session.put(SESSION_USER, username);
//第二种方式 获取serlvet的session
// HttpSession session = ServletActionContext.getRequest().getSession();
// session.setAttribute(SESSION_USER, username);
//第三章方式实现SessionAware接口,重写setSession方法
session.put(SESSION_USER, username);
return SUCCESS;
}
return ERROR;
}
//实现后台验证
@Override
public void validate() {
if(StringUtils.isEmpty(username)){
addFieldError("username", "用户名不能为空");
}
if(StringUtils.isEmpty(pwd)){
addFieldError("pwd", "密码不能为空");
}
super.validate();
}
@Override
public void setSession(Map<String, Object> session) {
this.session=session;
}
}
前台用struts2的表单的话。验证样式会好看点,如果使用struts2的表单的话,表单action的值不用加默认的”.action”,
<s:form action="userLogin" method="post">
<s:textfield name="username" label="用户名"></s:textfield>
<s:password name="pwd" label="密码"></s:password>
<s:submit value="http://www.mamicode.com/登录"></s:submit>
</s:form>
在struts.xml里加上这句话的时候,默认就不是.action结尾了,提交表单的话,
Value=http://www.mamicode.com/什么,就以什么结尾!如:
<constant name="struts.action.extension" value="http://www.mamicode.com/do"></constant>
那么 <form action="userLogin.do" method="post">就要改成do了!
前台页面如果要显示input传入后台的值,后台只要有和前台input标签里name =“”的值相同的字段名,并且要有get和set方法,然后
前台: <s:property value="http://www.mamicode.com/messages"/>就可以输出!
*********************************************************************************************************
struts2第二天配置详解:
首先在web.xml里要配置过滤器:
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
从前台的表单标签name里传的值可以直接在Action里的相同字段里取出,在Action中保存的数据都可以用${attributeName}语法访问取值,前提是所有访问的属性在Action类里的必须有get set访问器。
我Action类的配置:
package cn.jbit.action;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
public static final String SESSION_USER="user";
private static final long serialVersionUID = 1L;
private String name;
private String pwd;
private String url;
private List<Student> list;
public String show(){
System.out.println("我进来show了");
return SUCCESS;
}
public String add(){
System.out.println("我进来add方法了");
return SUCCESS;
}
public String del(){
System.out.println("我进来del方法了");
return SUCCESS;
}
public String judge(){
if(name.equals("admin")){
url="/index.jsp";
}else{
url="/error.jsp";
}
return SUCCESS;
}
public String exit(){
System.out.println("我进来exit了");
return "out";
}
@Override
public String execute() throws Exception {
if("admin".equals(name)&&"123".equals(pwd)){
list=new ArrayList<Student>();
for (int i = 0; i < 20; i++) {
list.add(new Student(i,"nameNo"+i));
}
return SUCCESS;
}
addActionError("用户不存在");
return INPUT;
}
@Override
public void validate() {
// if(StringUtils.isEmpty(name)){
// addFieldError("name", "用户名不能为空");
// }
// if(StringUtils.isEmpty(pwd)){
// addFieldError("pwd", "密码不能为空");
// }
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public List<Student> getList() {
return list;
}
public void setList(List<Student> list) {
this.list = list;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
Action中动态方法调用:
首先要开启:
<constant name="struts.enable.DynamicMethodInvocation" value="http://www.mamicode.com/true"></constant>
地址栏后面直接加上struts.xml里的逻辑视图name!Action类里的方法如:http://localhost:8080/s2/stulist!show.action
<!--切记动态调用的时候不要加method属性 -->
<action name="stulist" class="cn.jbit.action.UserAction">
<result name="success">success.jsp</result>
</action>
通配符的方式调用方法,可是省略很多action,输入的时候如:
http://localhost:8080/s2/user_add.action
<!-- 通配符的方式调用方法要加method属性 -->
<action name="user_*" class="cn.jbit.action.UserAction" method="{1}">
<result name="success">success.jsp</result>
</action>
动态生成结果 url在类里判断
<action name="testurl_*" class="cn.jbit.action.UserAction" method="{1}">
<result name="success">${url}</result>
</action>
类里的代码为:
public String judge(){
if(name.equals("admin")){
url="/index.jsp";
}else{
url="/error.jsp";
}
return SUCCESS;
}
动态生成结果刚好和result标签里的不同返回值对应,一个是根据ACTION类的返回不同的逻辑视图名去判断进入不同页面,一个是在ACTION类里先根据控制流语句,根据不同条件判断属性赋不同地址值,然后再在返回的逻辑视图<resultname="success">${url}</result>里给出这个地址的值。
重定向到action
<action name="exit_*" class="cn.jbit.action.UserAction" method="{1}">
<result name="out" type="redirectAction">
<param name="namespace">/</param>
<param name="actionName">out</param>
</result>
</action>
<action name="out">
<result type="redirect">/index.jsp</result>
</action>
其中type的值很多,其中四个为:
redirectAction:为重定向到action
Dispatcher:转发到jsp
Chain:转发到action
Redirect:重定向到jsp
全局结果 :有些重复用的东西,比如返回error就选用全局结果
<global-results>
<result name="error">index.jsp</result>
</global-results>
进来的时候如果匹配不到这个页面路径则进入默认的提示页面 error.jsp
<default-action-ref name="others"></default-action-ref>
<action name="others">
<result>error.jsp</result>
</action>
******************************************************************************************************
struts2自定义拦截器配置:
配置自己的拦截器可以先参照下系统的拦截器是怎么配置的,首先打开struts-default.xml搜索下interceptor;系统里的拦截器有很多,拦截器都是放在堆栈里的,系统引用的是默认堆栈, <interceptor-stack name="defaultStack">;
struts2.3版本下的默认堆栈里放有19个拦截器。我们随便找一个系统拦截器,找到那个类点进去,可以看到,系统的拦截器都继承自AbstractInterceptor,知道这些,那么我们可以自己创建一个自己的拦截器了:如
package cn.jbit.Iterceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invoc) throws Exception {
long begin=System.currentTimeMillis();
System.out.println("开始时间为:"+begin);
//拦截器和过滤器相似,都是一个链,都得有一个放行的方法,不然就没法继续进行了
String result=invoc.invoke();
//拦截器返回的结果是携带action的返回结果
System.out.println("结果为:"+result);
long end =System.currentTimeMillis();
System.out.println("结束时间为:"+end);
System.out.println("时间差为:"+(end-begin));
return result;
}
}
最后在struts.xml配置文件里的packge里加入(切记放置顺序,拦截器要放在action标签的上面):
<!-- 自己手动配置的拦截器 -->
<interceptors>
<!-- 自己的拦截器 -->
<interceptor name="myinter" class="cn.jbit.Iterceptor.MyInterceptor"></interceptor>
<!-- 把拦截器放进自己的堆栈中 -->
<interceptor-stack name="mystack">
<!-- 自己的堆栈首先引用自己的拦截器 -->
<interceptor-ref name="myinter"></interceptor-ref>
<!-- 自己的堆栈再加上系统配好的19个拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 默认引用自己的堆栈拦截器 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
**********************************************************************************************************
Struts2的iterator标签:
<s:iterator value="http://www.mamicode.com/list" id="no" status="st" var=”v”>
这里的id=”no”:可以当作集合里的每个子元素,可以点出东西
<s:property value="http://www.mamicode.com/#no.address" />
Var测试作用和id一样<s:property value="http://www.mamicode.com/#v.address" />
返回当前迭代了几个元素:<s:property value="http://www.mamicode.com/#st.count" />
元素索引:<s:property value="http://www.mamicode.com/#st.index" />
<s:if test="#st.odd">
当前是奇数行
</s:if>
<s:if test="#st.even">
当前是偶数行
</s:if>
房间id :<s:property value="http://www.mamicode.com/id" />
房间地址: <s:property value="http://www.mamicode.com/address" />
房间类型: <s:property value="http://www.mamicode.com/type" />
</s:iterator>
strits2初始配置总结