专栏首页Golang开发JavaWeb——Struts2

JavaWeb——Struts2

概述

Struts2是一个基于MVC设计模式web应用框架,在webwork框架技术基础上,Strurts2核心是拦截器,Struts2框架的核心功能都依靠拦截器实现的。Struts2框架对控制器进行了统一的和规范。

创建 一个Java web应用

增加 jetty plugin

  <groupId>cn.java.struts</groupId>
  <artifactId>BasicStruts</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
    <struts2.version>2.5.14.1</struts2.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
...
<build>
    ...   
  <finalName>basic-struts</finalName>
    <plugins>
        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.4.7.v20170914</version>
            <configuration>
                <webApp>
                    <contextPath>/${build.finalName}</contextPath>
                </webApp>
                <stopKey>CTRL+C</stopKey>
                <stopPort>8999</stopPort>
                <scanIntervalSeconds>10</scanIntervalSeconds>
                <scanTargets>
                    <scanTarget>src/main/webapp/WEB-INF/web.xml</scanTarget>
                </scanTargets>
            </configuration>
        </plugin>
    </plugins>
</build>

在src/main/下创建webapp目录,在webapp下创建WEB-INF目录,在WEB-INF目录创建web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
</web-app>

在src/main/webapp新建index.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Basic Struts 2 Application - Welcome</title>
  </head>
  <body>
    <h1>Welcome To Struts 2!</h1>
  </body>
</html>

增加 Struts 2 jar包

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>${struts2.version}</version>
</dependency>

在web.xml创建 Servlet Filter

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" 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">
    <display-name>Basic Struts2</display-name>
    <welcome-file-list>
        <welcome-file>index</welcome-file>
    </welcome-file-list>

    <filter>
        <filter-name>struts2</filter-name>
          <!--如果Struts2 的2.3.24版本应该是这样的
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    -->
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

创建HelloAction

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction  extends ActionSupport {
    @Override
    public String execute() throws Exception {
        System.out.println("执行action");
        return SUCCESS;
    }
}

创建struts.xml 在src/main/resources文件夹下创建 struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <package name="default" extends="struts-default">
        <action name="hello" class="cn.java.struts.HelloAction">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

mvn直接运行jetty:

mvn jetty:run

打开浏览器输入 注意是URL末尾是hello.action不是 hello.jsp

image.png

Struts动态方法调用

动态方法调用就是为了解决一个Anction对应多个请求的处理,以免Action太多。 1、xml中配置 method 属性,对应 指定方法

public class HelloAction  extends ActionSupport {

    public String add(){
        System.out.println("执行add");
        return SUCCESS;
    }
    public String update(){
        System.out.println("执行update");
        return SUCCESS;
    }
    @Override
    public String execute() throws Exception {
        System.out.println("执行action");
        return SUCCESS;
    }
    
}

修改struts.xml

<struts>
<package name="default" extends="struts-default">
    <action name="hello" class="cn.java.struts.HelloAction">
        <result >/success.jsp</result>
    </action>
    <action name="add" method="add" class="cn.java.struts.HelloAction">
        <result >/add.jsp</result>
    </action>
    <action name="update" method="update" class="cn.java.struts.HelloAction">
        <result >/update.jsp</result>
    </action>
</package>
</struts>

2、感叹号方式

public class HelloAction  extends ActionSupport {

    public String add(){
        System.out.println("执行add");
        return "add";
    }
    public String update(){
        System.out.println("执行update");
        return "update";
    }
    @Override
    public String execute() throws Exception {
        System.out.println("执行action");
        return SUCCESS;
    }

}
<struts>
<package name="default" extends="struts-default">
    <global-allowed-methods>regex:.*</global-allowed-methods>
    <action name="hello" class="cn.java.struts.HelloAction">
        <result >/success.jsp</result>
        <result name="add">/add.jsp</result>
        <result name ="update">/update.jsp</result>
    </action>
</package>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>

在struts2.5 为了提升安全性,要在package标签后加上<global-allowed-methods>regex:.*</global-allowed-methods>

image.png

3、通配符方式

<struts>
<package name="default" extends="struts-default">
    <global-allowed-methods>regex:.*</global-allowed-methods>
    <action name="hello_*" method="{1}" class="cn.java.struts.HelloAction">
        <result >/success.jsp</result>
        <result name="add">/{1}.jsp</result>
        <result name ="update">/{1}.jsp</result>
    </action>
</package>
<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
</struts>

image.png

默认Action页面

<default-action-ref name="error"></default-action-ref>
    <action name="error" method="error" class="cn.java.struts.HelloAction">
        <result name="error">/error.jsp</result>
    </action>
public class HelloAction  extends ActionSupport {

    public String error(){
        System.out.println("执行error");
        return ERROR;
    }
}

image.png

Struts2接收参数

使用Action属性接收
public class LoginAction extends ActionSupport {
    private String name;
    private String password;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String login() throws Exception {

        if ("admin".equals(name)&&"123456".equals(password)){
            return SUCCESS;
        }
        return ERROR;
    }
}

struts.xml增加login action

 <action name="login" method="login" class="cn.java.struts.LoginAction">
        <result name="success">/success.jsp</result>
        <result name="error">/error.jsp</result>
    </action>

image.png

通过model

创建login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User Login</title>
</head>
<body>
<center>
    <h1>用户登录</h1>
    <form action="login.action" method="post">
        用 户:<input type="text" name="name"><br>
        密 码:<input type="password" name="password"><br>
        <input type="submit" value="commit">
    </form>
</center>

</body>
</html>
public class LoginAction extends ActionSupport {
    private  User user;
    
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    
    public String login() throws Exception {
        if ("admin".equals(user.getName())&&"123456".equals(user.getPassword())){
            return SUCCESS;
        }
        return ERROR;
    }
}

User.java

public class User {
    private String name;
    private String password;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

修改login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User Login</title>
</head>
<body>
<center>
    <h1>用户登录</h1>
    <form action="login.action" method="post">
        用 户:<input type="text" name="user.name"><br>
        密 码:<input type="password" name="user.password"><br>
        <input type="submit" value="commit">
    </form>
</center>

</body>
</html>

ModelDriven

public class LoginAction extends ActionSupport implements ModelDriven<User> {
    private  User user = new User(); //必须实例化

    public String login() throws Exception {
        System.out.println(user.getName());
        System.out.println(user.getPassword());
        if ("admin".equals(user.getName())&&"123456".equals(user.getPassword())){
            return SUCCESS;
        }
        return ERROR;
    }

    @Override
    public User getModel() {
        return user;
    }
}

取得user

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User Login</title>
</head>
<body>
<center>
    <h1>用户登录</h1>
    <form action="login.action" method="post">
        用 户:<input type="text" name="name"><br>
        密 码:<input type="password" name="password"><br>
        <input type="submit" value="commit">
    </form>
</center>

</body>
</html>

Action中五种内置属性

(1) SUCCESS Action正确的执行完成,返回相应的视图,success是name属性的默认值。 (2) NONE 表示Action正确的执行完成,但并不返回任何事视图。 (3) ERROR 表示Action执行失效,返回错误处理视图。 (4) LOGIN Action因为用户没有登录的原因没有正确执行,将返回该登录视图,要求用户进行登录验证 (5) INPUT Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入界面,一般在应用中,会对这些 参数进行验证,如果验证没有通过,将自动返回该视图。

public class LoginAction extends ActionSupport implements ModelDriven<User> {
    private  User user = new User(); //必须实例化

    public String login() throws Exception {
        if(user.getName() ==null
                ||"".equals(user.getName().trim())){
            this.addFieldError("username","用户名为空");
            return INPUT;
        }

        if ("admin".equals(user.getName())&&"123456".equals(user.getPassword())){
            return SUCCESS;
        }
        return ERROR;
    }

    @Override
    public User getModel() {
        return user;
    }
}

增加input结果处理

<action name="login" method="login" class="cn.java.struts.LoginAction">
        <result name="success">/success.jsp</result>
        <result name="error">/error.jsp</result>
        <result name="input">/login.jsp</result>
    </action>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java基础——方法

    方法重载完成相同的功能,且多个方法的方法名相同,但是各自的参数不同。 方法重载主要依靠参数类型和数量区分。 方法重载返回值类型应该相同。

    羊羽shine
  • Django——基础创建

    manage.py是项目管理文件,通过它管理项目。 init.py是一个空文件,作用是这个目录demo1可以被当作包使用。 settings.py是项目的整...

    羊羽shine
  • 图形数据库neo4j——(2)Cypher

    羊羽shine
  • Struts2框架的基本使用(二)

         上一篇 Struts2框架的基本使用 我们限于篇幅,最后简单介绍了Action的配置问题,本篇接着介绍有关框架的一些其他基本用法,主要内容如下: Ac...

    Single
  • java之struts2的配置讲解(2) java之struts框架入门教程

    即从结构上可以看出,在HelloStruts项目中增加了config 文件夹(Source Folder) 及user.xml 文件

    Vincent-yuan
  • 闲来无事,倒腾了一个简单的silverlight视频播放器

    近二日闲来无事,把silverlight的官方文档瞅了瞅,倒腾了一个简单的视频播放器,顺便也测试了下能否播放传说中的h.264,最终效果如下: ? http:/...

    菩提树下的杨过
  • Struts2的常见的配置文件介绍

    1:package 定义一个包。 包作用,管理action。 (通常,一个业务模板用一个包)   常见属性及其说明:     (1)name  包的名字;以方便...

    别先生
  • Struts2 Namespace_命名空间

      namespace决定了action的访问路径,默认为"",可以接受所有路径的action

    Hongten
  • [技巧篇] 创建百万级实例如何节省内存?

    在实际工作中,我们可能会面临创建百万级别量实例的这种情况,比如在某流行社交网络中,定义了用户类 User(id, name, sex, status, ...)...

    Rocky0429
  • 关于PLC安全的一次实验

    (1)随着工业 4.0 的高速发展,工业自动化程度越来越高,但工控设备暴露在公网的情况也越发明显。而其中尤其以PLC最为明显,这些PLC设备的来源多为国外厂商,...

    FB客服

扫码关注云+社区

领取腾讯云代金券