Struts和servlet不能共存问题解决方法

yizhihongxing

当你在一个Java web项目中同时使用Struts和Servlet时,可能会出现以下错误:

java.lang.ClassCastException: org.apache.struts.action.ActionServlet cannot be cast to javax.servlet.Servlet

这是因为Struts包含了一个名为ActionServlet的类,并且在配置web.xml文件时,将这个类作为Servlet来使用。而Servlet API也包含了一个名为Servlet的接口。当你在编译和运行时同时引用两者时,可能会出现类型冲突错误。

解决这个问题的方法是,在web.xml文件中为Struts的ActionServlet配置一个Servlet名称,然后通过该名称来访问它,而不是直接使用Servlet的接口类。

具体的步骤如下:

1.在web.xml文件中添加一个servlet标签,配置ActionServlet的名称和类路径。如下示例:

<servlet>
    <servlet-name>struts</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    ...
</servlet>

2.在web.xml文件中添加一个servlet-mapping标签,将servlet的名称与url-pattern进行映射。如下示例:

<servlet-mapping>
    <servlet-name>struts</servlet-name>
    <url-pattern>/test/*</url-pattern>
</servlet-mapping>

在上面的示例中,我们将Struts的ActionServlet命名为“struts”,并映射到了“/test/*”路径下。然后我们就可以使用“/test/”路径来访问Struts的ActionServlet了,而不会发生类型冲突的错误。

示例1:使用Struts和Servlet来实现登陆功能

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final String LOGIN_VIEW = "/WEB-INF/jsp/login.jsp";
    private static final String WELCOME_VIEW = "/WEB-INF/jsp/welcome.jsp";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.getRequestDispatcher(LOGIN_VIEW).forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String account = request.getParameter("account");
        String password = request.getParameter("password");

        if ("admin".equals(account) && "123456".equals(password)) {
            request.getSession().setAttribute("account", account);
            request.getRequestDispatcher(WELCOME_VIEW).forward(request, response);
        } else {
            request.setAttribute("message", "Invalid account or password");
            request.getRequestDispatcher(LOGIN_VIEW).forward(request, response);
        }
    }
}

在上面的示例中,我们使用Servlet来处理/login请求,如果账号和密码正确,就将用户信息添加到session中,并跳转到welcome页面显示欢迎信息。否则就返回login页面并显示错误信息。

示例2:使用Struts和Servlet来实现CRUD功能

@RunWith(MockitoJUnitRunner.class)
public class BookControllerTest {
    @Mock
    private BookService bookService;

    @InjectMocks
    private BookController bookController = new BookController();

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(bookController).build();
    }

    @Test
    public void testListBooks() throws Exception {
        when(bookService.listBooks()).thenReturn(Arrays.asList(new Book(1, "Java programming"), 
                                                                  new Book(2, "Web development")));

        mockMvc.perform(get("/books"))
               .andExpect(status().isOk())
               .andExpect(view().name("books"))
               .andExpect(model().attributeExists("books"))
               .andExpect(model().attribute("books", hasSize(2)))
               .andExpect(model().attribute("books", hasItem(allOf(
                       hasProperty("id", is(1)),
                       hasProperty("name", is("Java programming"))
               ))))
               .andExpect(model().attribute("books", hasItem(allOf(
                       hasProperty("id", is(2)),
                       hasProperty("name", is("Web development"))
               ))));
    }

    @Test
    public void testAddBook() throws Exception {
        mockMvc.perform(post("/books").param("name", "Big data").with(csrf()))
               .andExpect(status().is3xxRedirection())
               .andExpect(view().name("redirect:/books"));

        verify(bookService, times(1)).addBook(new Book(null, "Big data"));
    }

    @Test
    public void testDeleteBook() throws Exception {
        mockMvc.perform(post("/books/1/delete").with(csrf()))
               .andExpect(status().is3xxRedirection())
               .andExpect(view().name("redirect:/books"));

        verify(bookService, times(1)).deleteBook(1);
    }
}

在上面的示例中,我们使用Struts来处理/books路径下的CRUD操作,包括列出所有书籍、添加新书籍和删除书籍。我们通过使用MockMvc来模拟HTTP请求和响应,来测试这些操作是否正确实现。这里值得注意的是,在使用MockMvc时,需要使用with(csrf())方法来保护表单免受跨站请求伪造攻击。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts和servlet不能共存问题解决方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 初识Java一些常见的数据类型

    我来详细讲解一下初识 Java 一些常见的数据类型。 数据类型简介 在 Java 中,数据类型是用来规定数据的类型和存储大小,便于编译器和计算机系统进行正确的处理。Java 语言中的基本数据类型有 8 种:byte、short、int、long、float、double、char 和 boolean。 下面依次介绍各个数据类型。 byte byte 数据类型…

    Java 2023年5月26日
    00
  • 详谈java编码互转(application/x-www-form-urlencoded)

    当我们进行HTTP请求时,参数会以一定的格式作为请求体进行传输。其中最常用的参数编码格式是application/x-www-form-urlencoded。在Java中,我们可以通过一些方式来进行此种编码格式的转化。 一、URLEncoding和URLDecoding Java中提供了两个工具类:java.net.URLEncoder和java.net.U…

    Java 2023年5月20日
    00
  • 避免sql注入_动力节点Java学院整理

    接下来我将详细讲解“避免SQL注入_动力节点Java学院整理”的完整攻略。 SQL注入是什么 SQL注入攻击是指攻击者在提交应用程序的输入值时,嵌入执行恶意的SQL语句,从而诱发数据库执行非预期的恶意操作。SQL注入是目前web程序中比较常见的漏洞种类之一,它是由于软件开发人员在编写应用程序或Web页面时,没有对用户输入的数据进行充分的检查,致使攻击者可以攻…

    Java 2023年5月27日
    00
  • SpringBoot实现阿里云短信发送的示例代码

    下面是详细讲解“SpringBoot实现阿里云短信发送的示例代码”的完整攻略,包含示例说明: 1. 注册阿里云短信服务 首先需要在阿里云官网上注册一个账号,进入控制台后选择开通短信服务。 开通短信服务后,获取AccessKey ID和AccessKey Secret。 2. 添加阿里云短信依赖 在SpringBoot项目中,使用Maven或Gradle添加阿…

    Java 2023年5月26日
    00
  • 虚引用的作用是什么?

    虚引用(Phantom Reference)是Java中一种比较特殊的引用类型,和软引用、弱引用类似,虚引用不会影响垃圾回收对象的生命周期,但是虚引用主要是用于对象被回收时的通知。 虚引用主要有两个作用: 控制对象回收时机 虚引用被实例化时需要与一个引用队列相关联,当对象被垃圾回收器标记为回收时,虚引用会被放入引用队列中,这时我们就可以通过判断引用队列中是否…

    Java 2023年5月10日
    00
  • 深入浅出讲解Java8函数式编程

    深入浅出讲解Java8函数式编程 简介 Java8引入了函数式接口和Lambda表达式,为Java语言添加了函数式编程的特性。本文将从以下几个方面深入浅出地讲解Java8函数式编程: 函数式接口(Functional Interface) Lambda表达式 方法引用(Method Reference) Stream API Optional类 函数式接口 …

    Java 2023年5月26日
    00
  • Java向List集合中批量添加元素的实现方法

    当我们需要向Java中的List类型的集合中批量添加元素时,通常可以使用以下两种方法: 1.使用addAll()方法 List集合的addAll()方法可以接收一个Collection类型的参数,用于将该Collection集合中的元素全部添加到List集合当中。代码示例如下: List<String> list1 = new ArrayList…

    Java 2023年5月26日
    00
  • Kafka源码系列教程之删除topic

    Kafka源码系列教程之删除topic 删除Kafka中的topic需要以下步骤: 关闭topic的所有消费者 停止所有的producer,确保没有新的消息被发布到该topic 从zookeeper中删除topic目录 从broker集群中删除该topic的所有分区 示例 1 假设我们要删除名为foo的topic。首先,我们需要查看哪些消费者正在订阅该top…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部