• 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>

  • 相关阅读:
    数组中找出最小的K个数
    温故而知新---Java(一)
    写一手简洁的代码
    同步IO与同步非阻塞IO的理解
    旋转打印矩阵
    求仅出现一次的最早字符
    spring 自定义schema 加载异常 White spaces are required between publicId and systemId.
    Java位运算知识点整理
    Idea 插件开发之DubboInvoke实践
    pinpoint插件开发实践
  • 原文地址:https://www.cnblogs.com/345214483-qq/p/4139689.html
Copyright © 2020-2023  润新知