IDEA Struts2注解的坑(有配置

本文介绍了使用 Struts2 注解进行开发时的配置步骤和常见问题,包括 web.xml 的配置、IDEA 中的版本适配、注解插件的使用以及命名空间的设定。通过示例代码展示了 action 类的注解用法,并提醒开发者注意 Struts2 插件默认扫描的 action 包名。此外,还提到了 Lombok 的使用以简化 Java 代码。
摘要由CSDN通过智能技术生成

IDEA Maven下Struts2注解踩坑解决

1.版本配置文件 版本推荐2.3 (2.5一下)

由于使用注解开发所以struts.xml或struts.properties 可以不使用,但是在整合Spring的时候需要这个文件来配置constant,这里就不多阐述整合问

我们在web.xml中配置应该是这个样子

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


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

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

2.5及其以上的版本没有了ng这个文件,所以配置的时候请删除,但是好像IDEA会爆红但是无伤大雅

2.导包以及其他注解注入(这里不算是坑

这里推荐的还是lombok这个包可以结合有参构造和无参构造以及基本的Get Set方法构造

pom.xml导入

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.24</version>
</dependency>

<dependency>
  <groupId>org.apache.struts</groupId>
  <artifactId>struts2-core</artifactId>
  <version>2.3.1.2</version>
  <scope>compile</scope>
</dependency>

<dependency>
  <groupId>org.apache.struts</groupId>
  <artifactId>struts2-convention-plugin</artifactId>
  <version>2.3.1.2</version>
</dependency>

导入下面struts2以及plugin的时候会自己下载其他的包,所以我们不需要管

给个结合lombok的例子

package com.hj.action;

import com.hj.Hjdao.HjUserDao;
import com.hj.Hjpojo.HjUser;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.struts2.convention.annotation.*;

import java.util.Map;

@Namespace("/")
@ParentPackage("struts-default")
@Results({
        @Result(name = "success", location = "/main.jsp"),
        @Result(name = "error", location = "/error.jsp")
})
@Data
@NoArgsConstructor
public class HjLoginAction extends ActionSupport {

    private HjUser hjUser;
    @Action(value = "login")
    public String  execute() throws Exception {
        HjUserDao hjUserDao = new HjUserDao();
        hjUser = hjUserDao.cheackUser(this.hjUser.getName(),this.hjUser.getPassword());
        if (hjUser!=null){
            Map session = ActionContext.getContext().getSession();
            session.put("login",hjUser);
            return SUCCESS;
        }
        else return ERROR;
    }
    
}

这里无参构造只是为了符合开发标准,使用@Data则是为了获取到页面所传过来,我们所定义的HjUser类型数据,也就是构建了对应的 Get 和 Set

隐藏的代码(Get 和 Set):

    public HjUser getHjUser() {
        return hjUser;
    }
    public void setHjUser(HjUser hjUser) {
        this.hjUser = hjUser;
    }

3.命名空间对应(小坑

在上面的代码中我们可以看到

@Namespace("/")

我们将这个action的命名空间改到了/

我们看一下jsp页面

<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<body>
<h2>Hello World!</h2>
<s:form action="login" method="post" theme="simple" namespace="/" >
    <table>
        <caption>用户登录</caption>
        <tr>
            <td>登录名<s:textfield name="hjUser.name" size="20"/></td>
        </tr>
        <tr>
            <td>密&nbsp;&nbsp;码<s:password name="hjUser.password" size="21"/></td>
        </tr>
        <tr>
            <td>
                <s:submit value="登录"/>
                <s:reset value="重置"/>
            </td>
        </tr>
    </table>
</s:form>
</body>
</html>

jsp的表单中也有一个属性是namespace=“/”

这里我们的那个注解是不能省略的,否则会报一个错就是找不到这个命名空间 (这里还是推荐都进行命名)

4.注解插件究极大坑

总的下来就是这个卡了我近10个小时,到后面看到底层文件,看到扫描包的代码的时候我绷不住了,如果没有在struts.xml相关的配置文件中设置,默认只扫描名为action的包

这里给一下我的HjLoginAction的package

package com.hj.action;

在这里插入图片描述

目录结构

事例代码

JSP页面

index.jsp

<%@ page language="java" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<body>
<h2>Hello World!</h2>
<s:form action="login" method="post" theme="simple" namespace="/" >
    <table>
        <caption>用户登录</caption>
        <tr>
            <td>登录名<s:textfield name="hjUser.name" size="20"/></td>
        </tr>
        <tr>
            <td>密&nbsp;&nbsp;码<s:password name="hjUser.password" size="21"/></td>
        </tr>
        <tr>
            <td>
                <s:submit value="登录"/>
                <s:reset value="重置"/>
            </td>
        </tr>
    </table>
</s:form>

</body>
</html>

error.jsp

<%--
  Created by IntelliJ IDEA.
  User: hj
  Date: 2022/9/6
  Time: 9:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

</body>
</html>

main.jsp

<%--
  Created by IntelliJ IDEA.
  User: hj
  Date: 2022/9/6
  Time: 9:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
    <title>登录成功</title>
</head>
<body>
    <h1>登录成功</h1>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


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

  <display-name>bookManage</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Java代码

action代码

package com.hj.action
import com.hj.Hjdao.HjUserDao;
import com.hj.Hjpojo.HjUser;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.struts2.convention.annotation.*
import java.util.Map;
@Namespace("/")
//@ParentPackage("struts-default")
@Results({
        @Result(name = "success", location = "/main.jsp"),
        @Result(name = "error", location = "/error.jsp")
})
@Data
@NoArgsConstructor
public class HjLoginAction extends ActionSupport {
    private HjUser hjUser;
    @Action(value = "login")
    public String  execute() throws Exception {
        HjUserDao hjUserDao = new HjUserDao();
        hjUser = hjUserDao.cheackUser(this.hjUser.getName(),this.hjUser.getPassword());
        if (hjUser!=null){
            Map session = ActionContext.getContext().getSession();
            session.put("login",hjUser);
            return SUCCESS;
        }
        else return ERROR;
    }
}

HjUserDao代码

package com.hj.Hjdao;
import com.hj.HjDb.HjDbconn;
import com.hj.Hjpojo.HjUser;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class HjUserDao implements HjUserMapper {
    private HjDbconn hjDbconn;
    @Override
    public HjUser cheackUser(String name, String password) throws ClassNotFoundException, SQLException {
        Connection connection = hjDbconn.getConn();
        if (connection!=null) {
            PreparedStatement preparedStatement = connection.prepareStatement("select * from mbook where name =? and password=?");
            preparedStatement.setObject(1, name);
            preparedStatement.setObject(2, password);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
                HjUser hjUser = new HjUser();
                hjUser.setId(resultSet.getInt(1));
                hjUser.setName(resultSet.getString(2));
                hjUser.setPassword(resultSet.getString(3));
                hjUser.setRole(resultSet.getBoolean(4));
                hjDbconn.CloseConn();
                return hjUser;
            }
        }
        hjDbconn.CloseConn();
        return null;
    }
}

HjUserMapper代码

package com.hj.Hjdao;
import com.hj.Hjpojo.HjUser;
import java.sql.SQLException;
public interface HjUserMapper {
    public HjUser cheackUser(String name, String password) throws ClassNotFoundException, SQLException;
}

HjDbconn代码

package com.hj.HjDb;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException
public class HjDbconn {
    public static Connection conn;
    public static String Driver="com.mysql.jdbc.Driver";
    public HjDbconn() {
    }
    public static Connection getConn() {
        try {
            System.out.println("我在这里");
            Class.forName(Driver);
            System.out.println("成功了");
            conn = DriverManager.getConnection("要学会自己连接数据A.A");
            return conn;
        } catch (Exception var1) {
            var1.printStackTrace();
            return null;
        }
    }
    public static void CloseConn() {
        try {
            conn.close();
        } catch (Exception var1) {
            var1.printStackTrace();
        }

    }
}

HjUser代

package com.hj.Hjpojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class HjUser {
    private Integer id;
    private String name;
    private String password;
    private Boolean role;
}

总结

  • 找了很多资料,但是网上IDEA配置蛮少的,后续大概可能似乎好像我会更新吧
  • action这个东西在命名空间和扫描包上这个仇我记住了
  • 拦截器那些也有注解,更多注解网上也有讲怎么用,自行搜索
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾米莉亚小汉堡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值