Struts2项目搭建之struts.xml配置

Posted 二次猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2项目搭建之struts.xml配置相关的知识,希望对你有一定的参考价值。

说明

1.本文介绍Struts2的struts.xml配置-动态方法调用
2.本文介绍Struts2的struts.xml配置-指定多个配置文件
3.本文介绍Struts2的struts.xml配置-Struts2中配置默认Action
4.本文介绍Struts2的struts.xml配置-Struts2 访问后缀设置

准备工作

LoginAction 部分

package login.action;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import login.entity.LoginEntity;import org.apache.log4j.Logger;import org.apache.struts2.ServletActionContext;import util.log4j.MyLog4J;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;/** * 创建日期:2018年03月04日 * 创建时间:10:15 * 项目名称:DEMO */public class LoginAction extends ActionSupport implements ModelDriven<LoginEntity> {    private Logger myLog4J = MyLog4J.getLog(this.getClass());    private LoginEntity loginEntity = new LoginEntity();    @Override
    public String execute() throws Exception {
        String result;
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
        ServletContext application = ServletActionContext.getServletContext();        if (loginEntity != null && loginEntity.getUserName() != null && loginEntity.getUserPassword() != null) {            if (loginEntity.getUserName().equals("erciyuan") && loginEntity.getUserPassword().equals("12345678")) {                //登入成功后的欢迎提示
                request.setAttribute("request_hello", "登入成功,欢迎来到Struts2首页");
                result = SUCCESS;
            } else {                //保存账号和密码
                session.setAttribute("session_username", loginEntity.getUserName());
                session.setAttribute("session_userPassword", loginEntity.getUserPassword());                //网站访问量
                Integer integer = (Integer) application.getAttribute("application_counter");
                integer = integer == null ? 1 : ++integer;
                application.setAttribute("application_counter", integer);
                myLog4J.info(String.valueOf(integer));                if (loginEntity != null)
                    loginEntity.setIsLogin("用户名或密码错误");
                result = LOGIN;
            }
        } else {
            result = LOGIN;
        }        return result;
    }    public LoginEntity getModel() {        return loginEntity;
    }
}

1.动态方法调用

三种方式

  • 指定method属性

  • 感叹号(!)方式(不推荐使用)

  • 通配符方式(推荐使用)

指定method属性

struts.xml

<?xml version="1.0" encoding="GBK"?><!DOCTYPE struts PUBLIC        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"        "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>
    <include file="struts-default.xml"/>
    <package name="login.action.LoginAction" extends="struts-default" namespace="/">
        <action name="login" class="login.action.LoginAction" method="execute">
            <result name="success" type="dispatcher">/login/login.jsp</result>
            <result name="login" type="dispatcher">/index.jsp</result>
        </action>
    </package></struts>

感叹号(!)方式(不推荐使用)

struts.xml部分

<?xml version="1.0" encoding="GBK"?><!DOCTYPE struts PUBLIC        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"        "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>
    <include file="struts-default.xml"/>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <package name="login.action.LoginAction" extends="struts-default" namespace="/">
        <action name="login" class="login.action.LoginAction">
            <result name="success" type="dispatcher">/login/login.jsp</result>
            <result name="login" type="dispatcher">/index.jsp</result>
        </action>
    </package></struts>

启动后输入http://localhost:8080/login!execute.action


通配符方式(推荐使用)

struts.xml部分

<?xml version="1.0" encoding="GBK"?><!DOCTYPE struts PUBLIC        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"        "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>
    <include file="struts-default.xml"/>
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <package name="login.action.LoginAction" extends="struts-default" namespace="/">
        <action name="*_*_*" class="{1}.action.{2}Action" method="{3}">
            <result name="success" type="dispatcher">/login/login.jsp</result>
            <result name="login" type="dispatcher">/index.jsp</result>
        </action>
    </package></struts>

LoginAction部分

package login.action;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import login.entity.LoginEntity;import org.apache.log4j.Logger;import org.apache.struts2.ServletActionContext;import util.log4j.MyLog4J;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;/** * 创建日期:2018年03月04日 * 创建时间:10:15 * 项目名称:DEMO */public class LoginAction extends ActionSupport implements ModelDriven<LoginEntity> {    private Logger myLog4J = MyLog4J.getLog(this.getClass());    private LoginEntity loginEntity = new LoginEntity();    private HttpServletRequest request = ServletActionContext.getRequest();    private HttpSession session = request.getSession();    private ServletContext application = ServletActionContext.getServletContext();    public String index() {        if (request != null)
            request.removeAttribute("request_hello");        if (session != null) {
            session.removeAttribute("session_username");
            session.removeAttribute("session_userPassword");
        }        if (application != null)
            application.removeAttribute("application_counter");        return LOGIN;
    }    public String login() {
        String result;        if (loginEntity != null && loginEntity.getUserName() != null && loginEntity.getUserPassword() != null) {            if (loginEntity.getUserName().equals("erciyuan") && loginEntity.getUserPassword().equals("12345678")) {                //登入成功后的欢迎提示
                request.setAttribute("request_hello", "登入成功,欢迎来到Struts2首页");
                result = SUCCESS;
            } else {                //保存账号和密码
                session.setAttribute("session_username", loginEntity.getUserName());
                session.setAttribute("session_userPassword", loginEntity.getUserPassword());                //网站访问量
                Integer integer = (Integer) application.getAttribute("application_counter");
                integer = integer == null ? 1 : ++integer;
                application.setAttribute("application_counter", integer);
                myLog4J.info(String.valueOf(integer));                if (loginEntity != null)
                    loginEntity.setIsLogin("用户名或密码错误");
                result = LOGIN;
            }
        } else {
            result = LOGIN;
        }        return result;
    }    public LoginEntity getModel() {        return loginEntity;
    }
}

login.jsp部分

<%@ page contentType="text/html;charset=GBK" language="java" %><html><head>    <title>登入成功界面</title></head><body><%--接收request参数--%><div>    ${request_hello}    <a href="<%=request.getContextPath()%>/login/docs/index.html">Struts2官方教程</a>    <form action="login_Login_index.action">        <%--返回首页,并且注销登入--%>        <button type="submit">完全退出</button>    </form>    <a href=""></a></div></body></html>

index.jsp部分

<%@ page contentType="text/html;charset=GBK" language="java" %><%    Object str = application.getAttribute("application_counter");    str = str != null ? "第" + str + "次访问此页面" : ""; %><html><head>
    <title>登入界面</title></head><body><form action="login_Login_login.action" name="login.LoginAction">
    <%--接收session参数--%>
    <input type="text" id="login_user_name" name="userName" placeholder="请输入用户名" value="${session_username}"/>
    <input type="password" id="login_user_password" name="userPassword" placeholder="请输入密码"           value="${session_userPassword}"/>

    <div id="login_is_userName">${isLogin}</div>
    <%--接收application参数--%>
    <div id="login_counter">
        <%=str%>
    </div>
    <input type="submit" id="login" value="登入"/></form></body></html>

指定多个配置文件

struts.xml部分

<?xml version="1.0" encoding="GBK"?><!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="true" />
    <include file="struts-default.xml"/>
    <include file="login.xml"/></struts>

login.xml部分(和struts.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>
        <package name="login.action.LoginAction" extends="struts-default" namespace="/">
                <action name="*_*_*" class="{1}.action.{2}Action" method="{3}">
                        <result name="success" type="dispatcher">/login/login.jsp</result>
                        <result name="login" type="dispatcher">/index.jsp</result>
                </action>
        </package></struts>

Struts2中配置默认Action

1.当访问的Action不存在时,页面会显示错误信息,可以通过配置默认Action处理用户异常的操作;
2.配置方法:
在struts.xml文件中的<package>下添加如下内容:
<default-action-ref name="default_name"></default-action-ref>
其中default_name为默认Action的name属性值;
3.配置默认Action后,相应的namespace下不存在要访问的Action时,自动跳转到默认Action处理。

login.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>
    <package name="login.action.LoginAction" extends="struts-default" namespace="/">
        <default-action-ref name="login"/>
        <action name="login" class="login.action.LoginAction" method="index">
            <result name="login" type="dispatcher">/index.jsp</result>
        </action>
        <action name="*_*_*" class="{1}.action.{2}Action" method="{3}">
            <result name="success" type="dispatcher">/login/login.jsp</result>
            <result name="login" type="dispatcher">/index.jsp</result>
        </action>
    </package></struts>

输入一个不存在的action测试,http://localhost:8080/cc.action,会进入和http://localhost:8080/login.action完全一样的结果,并且注销用户,可以用于非法访问网站


Struts2 访问后缀设置

三种方式可以设置后缀

  • 在struts.xml文件中添加(推荐)

  • 在struts.properties中添加

  • 在web.xml的过滤器中添加
    警告:请勿三种方式都一起使用到项目中,否则web.xml优先级最高,如果少配置一个后缀将会有可能得不到正确的跳转导致报错

struts.xml文件中添加

struts.xml部分

<?xml version="1.0" encoding="GBK"?><!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="true" />
    <include file="struts-default.xml"/>
    <include file="login.xml"/>
    <constant name="struts.action.extension" value="do,to"/></struts>

login部分

<%@ page contentType="text/html;charset=GBK" language="java" %><html><head>    <title>登入成功界面</title></head><body><%--接收request参数--%><div>    ${request_hello}    <a href="<%=request.getContextPath()%>/login/docs/index.html">Struts2官方教程</a>    <form action="login_Login_index.to">        <%--返回首页,并且注销登入--%>        <button type="submit">完全退出</button>    </form>    <a href=""></a></div></body></html>

index.jsp部分

<%@ page contentType="text/html;charset=GBK" language="java" %><%    Object str = application.getAttribute("application_counter");    str = str != null ? "第" + str + "次访问此页面" : ""; %><html><head>
    <title>登入界面</title></head><body><form action="login_Login_login.do" name="login.LoginAction">
    <%--接收session参数--%>
    <input type="text" id="login_user_name" name="userName" placeholder="请输入用户名" value="${session_username}"/>
    <input type="password" id="login_user_password" name="userPassword" placeholder="请输入密码"           value="${session_userPassword}"/>

    <div id="login_is_userName">${isLogin}</div>
    <%--接收application参数--%>
    <div id="login_counter">
        <%=str%>
    </div>
    <input type="submit" id="login" value="登入"/></form></body></html>

在struts.properties中添加

struts.action.extension=do,to,

在web.xml的过滤器中添加

web.xml部分

<?xml version="1.0" encoding="GBK"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1">
    <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>
        <init-param>
            <param-name>struts.action.extension</param-name>
            <param-value>do</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping></web-app>

本人是一枚程序猿,如果觉得整理的不错,请关注个人微信公众号(扫一扫):



让程序猿能共同成长起来

让程序猿传播和共享技术

让程序猿养成做笔记习惯

让程序猿持续的增长知识

让程序猿写代码更加规范

让程序猿职场上学会低调


以上是关于Struts2项目搭建之struts.xml配置的主要内容,如果未能解决你的问题,请参考以下文章

1.环境搭建

java之struts2的配置讲解

用eclipse 搭建struts2环境

搭建一个简单的Struts2应用

Struts2环境搭建

Struts2框架使用之struts.xml配置