strits2初始配置总结

********************************************************************************************************************

struts2第一天课程的简单配置:

新建 Web Project后导入Struts2.jar包,在struts-2.3.16.3-all.zipstruts-2.3.16.3apps下找到struts2-blank.war,打开之后找到struts2-blank.warWEB-INFlib下的13jar.

再找到struts2-blank.warWEB-INFsrcjava下的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="false" />

    <constant name="struts.devMode" value="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="提交">

  </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="登录"></s:submit>

</s:form>

在struts.xml里加上这句话的时候,默认就不是.action结尾了,提交表单的话,

Value=什么,就以什么结尾!如:

 <constant name="struts.action.extension" value="do"></constant>

那么 <form action="userLogin.do" method="post">就要改成do了!

前台页面如果要显示input传入后台的值,后台只要有和前台input标签里name =“”的值相同的字段名,并且要有getset方法,然后

前台: <s:property value="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="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="list" id="no" status="st" var=”v”>

    这里的id=”no”:可以当作集合里的每个子元素,可以点出东西

            <s:property value="#no.address" />

            Var测试作用和id一样<s:property value="#v.address" />

 

   返回当前迭代了几个元素:<s:property value="#st.count" />

 元素索引:<s:property value="#st.index" />

<s:if test="#st.odd">

      当前是奇数行

    </s:if>

<s:if test="#st.even">

      当前是偶数行

    </s:if>

   房间id :<s:property value="id" />

   房间地址: <s:property value="address" />

   房间类型: <s:property value="type" />

</s:iterator>

原文地址:https://www.cnblogs.com/345214483-qq/p/4139689.html