# Gradle
## java com gradle Struts Funcionando
### Configuração gradle 6.4, java 8.0, postgre 15
### Spring Security, Struts 2, Apache Tomcat 9.0.09
```cmd=
plugins {
id 'java'
id 'application'
}
group 'com.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'junit:junit:4.13.2'
}
application {
mainClassName = 'com.example.Main'
}
```
### ./gradlew bootRun
### Java
```java=
plugins {
id 'org.springframework.boot' version '2.6.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'war'
}
group = 'com.example'
version = '1.0-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.apache.struts:struts2-core:2.5.29'
implementation 'org.apache.struts:struts2-spring-plugin:2.5.29'
runtimeOnly 'mysql:mysql-connector-java' // Use o conector do seu banco de dados
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
```
### ServletContextInitializer
```java=
package com.seuprojeto;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Configuration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
@Configuration
public class WebAppInitializer implements ServletContextInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter("contextConfigLocation", "classpath:struts.xml");
servletContext.addListener(new org.apache.struts2.dispatcher.listener.StrutsListener());
servletContext.addFilter("struts2", new org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter())
.addMappingForUrlPatterns(null, false, "/*");
}
}
```
###
```cmd=
plugins {
id "org.springframework.boot.starter"
}
description = "Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container"
dependencies {
api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter"))
api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-json"))
api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-tomcat"))
api("org.springframework:spring-web")
api("org.springframework:spring-webmvc")
}
```
## struts.xml
```cmd=
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="com.example.action.LoginAction">
<result name="success">/WEB-INF/jsp/welcome.jsp</result>
<result name="error">/WEB-INF/jsp/login.jsp</result>
</action>
<action name="register" class="com.example.action.RegisterAction">
<result name="success">/WEB-INF/jsp/login.jsp</result>
<result name="error">/WEB-INF/jsp/register.jsp</result>
</action>
</package>
</struts>
```
## LoginAction
```cmd=
package com.example.action;
import com.opensymphony.xwork2.ActionSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class LoginAction extends ActionSupport {
private String username;
private String password;
@Autowired
private JdbcTemplate jdbcTemplate;
public String execute() {
String sql = "SELECT COUNT(*) FROM users WHERE username = ? AND password = ?";
int count = jdbcTemplate.queryForObject(sql, new Object[]{username, password}, Integer.class);
if (count > 0) {
return SUCCESS;
} else {
addActionError("Invalid username or password");
return ERROR;
}
}
// Getters and setters
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
```
## RegisterAction
```cmd=
package com.example.action;
import com.opensymphony.xwork2.ActionSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class RegisterAction extends ActionSupport {
private String username;
private String password;
@Autowired
private JdbcTemplate jdbcTemplate;
public String execute() {
String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
jdbcTemplate.update(sql, username, password);
return SUCCESS;
}
// Getters and setters
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
```
### /webapp/WEB-INF/jsp/login.jsp
```cmd=
/webapp/WEB-INF/jsp/login.jsp
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<s:form action="login" method="post">
<s:textfield name="username" label="Username"/>
<s:password name="password" label="Password"/>
<s:submit value="Login"/>
</s:form>
<s:actionerror/>
</body>
</html>
```
## register.jsp
```cmd=
webapp/WEB-INF/jsp/register.jsp
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>Register</title>
</head>
<body>
<h2>Register</h2>
<s:form action="register" method="post">
<s:textfield name="username" label="Username"/>
<s:password name="password" label="Password"/>
<s:submit value="Register"/>
</s:form>
<s:actionerror/>
</body>
</html>
```
### Application
```java=
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
## WebConfig
```cmd=
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
@Configuration
public class WebConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/seu_banco_de_dados");
dataSource.setUsername("seu_usuario");
dataSource.setPassword("sua_senha");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
```
## gradle clean build
## gradle bootRun
```cmd=
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ ├── action
│ │ │ ├── LoginAction.java
│ │ │ └── RegisterAction.java
│ │ ├── config
│ │ │ └── WebConfig.java
│ │ └── Application.java
│ ├── resources
│ │ └── struts.xml
│ └── webapp
│ └── WEB-INF
│ └── jsp
│ ├── login.jsp
│ └── register.jsp
└── build.gradle
```
```cmd=
plugins {
id 'org.springframework.boot' version '2.6.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'war'
}
group = 'com.example'
version = '1.0-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-tomcat'
implementation 'org.apache.struts:struts2-core:2.5.29'
implementation 'org.apache.struts:struts2-spring-plugin:2.5.29'
implementation 'javax.servlet:jstl'
runtimeOnly 'mysql:mysql-connector-java' // Use o conector do seu banco de dados
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
```
## aplication.properties
```cmd=
spring.datasource.url=jdbc:mysql://localhost:3306/seu_banco_de_dados
spring.datasource.username=seu_usuario
spring.datasource.password=sua_senha
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
```
## src/main/resources/struts.xml
```java=
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="com.example.action.LoginAction">
<result name="success">/WEB-INF/jsp/welcome.jsp</result>
<result name="error">/WEB-INF/jsp/login.jsp</result>
</action>
<action name="register" class="com.example.action.RegisterAction">
<result name="success">/WEB-INF/jsp/login.jsp</result>
<result name="error">/WEB-INF/jsp/register.jsp</result>
</action>
</package>
</struts>
```
## LoginAction
```cmd=
package com.example.action;
import com.opensymphony.xwork2.ActionSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class LoginAction extends ActionSupport {
private String username;
private String password;
@Autowired
private JdbcTemplate jdbcTemplate;
public String execute() {
String sql = "SELECT COUNT(*) FROM users WHERE username = ? AND password = ?";
int count = jdbcTemplate.queryForObject(sql, new Object[]{username, password}, Integer.class);
if (count > 0) {
return SUCCESS;
} else {
addActionError("Invalid username or password");
return ERROR;
}
}
// Getters and setters
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
```
### RegisterAction
```cmd=
package com.example.action;
import com.opensymphony.xwork2.ActionSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class RegisterAction extends ActionSupport {
private String username;
private String password;
@Autowired
private JdbcTemplate jdbcTemplate;
public String execute() {
String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
jdbcTemplate.update(sql, username, password);
return SUCCESS;
}
// Getters and setters
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
```
### https://github.com/apache/struts-examples
###
```cmd=
https://github.com/apache/struts-examples
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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_2_5.xsd">
<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>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
```
## https://struts.apache.org/getting-started/how-to-create-a-struts2-web-application
### mvn jetty:run
### Cedrtificated
```cmd=
$ openssl s_client -connect repo.maven.apache.org:443
```
```cmd=
MIIGazCCBVOgAwIBAgIQAXLAZBooKf1RECf2cHoYsTANBgkqhkiG9w0BAQsFADBY
MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEuMCwGA1UE
AxMlR2xvYmFsU2lnbiBBdGxhcyBSMyBEViBUTFMgQ0EgMjAyMyBRNDAeFw0yMzEy
MTcxNzUxMTRaFw0yNTAxMTcxNzUxMTNaMCAxHjAcBgNVBAMMFXJlcG8ubWF2ZW4u
YXBhY2hlLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANPmLVYJ
BGGMOeAuuZ07bhuezPK0BZM8ymGvPeQG6dtqMFX+jvGcEOElXFIf1EJlYT8OjUfg
lhaocC3x4yOIAwpJOeKMTtKSp+hN+qrEU0gk9Suny8JmZ6gheTs+p+AomcQTWANX
twEomanUoAaBEHDG/z8zNISygPgkchnZwWhTZ9X+2utXNfQTM51G0rnYu0igYIdZ
7LRcUoyGU1v2rfSjzJN+maHeXvHcuXCZulaxsw2NP0nHNu57IPNxvTr3edxpN6v+
3QKxIE61gr0RqSrpS1mCkeqZBO23Wgz2+rC14efTNkFdVJodg4A8ffHtIbemo6RY
Wd3Cdr7WoX3SYqkCAwEAAaOCA2cwggNjMCAGA1UdEQQZMBeCFXJlcG8ubWF2ZW4u
YXBhY2hlLm9yZzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
CCsGAQUFBwMCMB0GA1UdDgQWBBQ93URT65FichWIWGvbb0ze7R/3OjBXBgNVHSAE
UDBOMAgGBmeBDAECATBCBgorBgEEAaAyCgEDMDQwMgYIKwYBBQUHAgEWJmh0dHBz
Oi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAwGA1UdEwEB/wQCMAAw
gZ4GCCsGAQUFBwEBBIGRMIGOMEAGCCsGAQUFBzABhjRodHRwOi8vb2NzcC5nbG9i
YWxzaWduLmNvbS9jYS9nc2F0bGFzcjNkdnRsc2NhMjAyM3E0MEoGCCsGAQUFBzAC
hj5odHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2F0bGFzcjNk
dnRsc2NhMjAyM3E0LmNydDAfBgNVHSMEGDAWgBSqEXGPlcRYmIuxbg87UGgkvLgZ
vDBIBgNVHR8EQTA/MD2gO6A5hjdodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2Nh
L2dzYXRsYXNyM2R2dGxzY2EyMDIzcTQuY3JsMIIBfAYKKwYBBAHWeQIEAgSCAWwE
ggFoAWYAdQBOdaMnXJoQwzhbbNTfP1LrHfDgjhuNacCx+mSxYpo53wAAAYx451Jd
AAAEAwBGMEQCIBeejHrzGcl7Lrb5L8rhhOHlQni26PF1aEXfYZZvNFIaAiAj+WJH
9iQ/rPI57uHhkw/WwjxmnNY1GpAj2NGfH54k5AB2AD8XS0/XIkdYlB1lHIS+DRLt
kDd/H4Vq68G/KIXs+GRuAAABjHjnUkMAAAQDAEcwRQIhANFI48P8IfmKY+LexiUL
7aV0UUCumQ4eQH0t3W4nnmSXAiBNdz0s6QmJHZiMVUbmBSxMGGhOgXAalRm1fkJ2
fuuuoAB1AM8RVu7VLnyv84db2Wkum+kacWdKsBfsrAHSW3fOzDsIAAABjHjnUvEA
AAQDAEYwRAIgQlPixnbAxCpnRSKQwGV8x8+tzGinHCZK4C0ev3Y3mtYCIDsUGpNZ
WNQloNm7+QPlwtM2uEvebTbG0iYbjh6bQ2cVMA0GCSqGSIb3DQEBCwUAA4IBAQCU
rFNxKOcxSnxT1tRnETEdGTdSPV13FDH2kOA+14QMftTo0UuXohXTXTSBpFbD+Mir
XzQJ9la1/nIFFoKJxqWd4pXNDy+aJMT+x1023gJX7nsXOls7o4NdoqYlRgjdO1/G
ResQyq1CE0lnvbb+ZXqQrva23HJOM2V3/03EBWhdOr5Ph4jL7ALAuPxiiyrdKgtJ
28cYCdu/XDVutVC0QBCoqmcqTkFSr7Up+2iks65+uLZDOT8Rs6LcuQb6ZPX5mue5
47OVj7OKR84KKErsEK+XmNOGetRTsIg8N2BH0zWgXqxGU4a+IxFE48I7fCNxNCPB
/1GMGmU7FoOXyZCK8DOw
```
## SSSL
```cmd=
New, TLSv1.2, Cipher is ECDHE-RSA-CHACHA20-POLY1305
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-CHACHA20-POLY1305
Session-ID: F0EEA651074F23486A7E673D08BFC0F85AE1C5BBE562CA6C1F944F330D8D3171
Session-ID-ctx:
Master-Key: E8E67AF435D37BD3F10024405871648D7CB2C2905D1790B095390E1D11F10661EA09D233F62DDF44420136B3E7FFF69D
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 7199 (seconds)
TLS session ticket:
0000 - b3 9a 5b 04 b8 07 d3 43-67 6c cc 37 27 25 43 3d ..[....Cgl.7'%C=
0010 - f9 db 24 35 09 fe 3b 77-21 84 9b af 9f a4 b9 96 ..$5..;w!.......
0020 - 77 d5 2f a4 93 16 05 69-eb a4 77 8d 27 b3 97 99 w./....i..w.'...
0030 - 80 67 a2 5b 2e 15 39 40-9e f3 92 9f dd 12 6b d8 .g.[..9@......k.
0040 - b0 c8 c5 18 88 90 7d 21-34 6a c5 f6 b1 0c 8f 21 ......}!4j.....!
0050 - 92 9f e2 1c 9b de 96 6b-47 f4 4e 60 e8 2f e2 aa .......kG.N`./..
0060 - a1 d2 cb 64 24 b1 5d af-76 e2 56 ce c1 2c 00 8f ...d$.].v.V..,..
0070 - b1 73 7f af 6a 31 f6 8d-a3 e1 d1 6b 99 a6 fc 6a .s..j1.....k...j
0080 - 3a d5 21 70 bd 17 e7 78-d6 58 d9 21 18 d8 45 d2 :.!p...x.X.!..E.
0090 - a3 e9 26 c1 29 6b 45 12-d9 a3 0f 1f de 1f 6e 3f ..&.)kE.......n?
00a0 - 11 73 30 be ac cf 6b 1b-ab 05 f7 22 25 b8 b7 66 .s0...k...."%..f
00b0 - 90 58 15 c7 f0 5d d1 ae-97 f6 2e 3a f1 28 ce 01 .X...].....:.(..
Start Time: 1719205290
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: yes
---
```
### Openssl
```cmd=
# Gerar uma chave privada
openssl genrsa -out mykey.key 2048
# Criar um pedido de assinatura de certificado (CSR)
openssl req -new -key mykey.key -out mycsr.csr
# Gerar o certificado SSL autoassinado usando a chave privada e o CSR
openssl x509 -req -days 365 -in mycsr.csr -signkey mykey.key -out mycert.crt
```
## Comandos realizado OPENSSL
```cmd=
openssl genrsa -out mykey.key 2048
# gerar certificado
### openssl req -new -key mykey.key -out myrequest.csr
openssl req -new -key mykey.key -out myrequest.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:RJ
Locality Name (eg, city) []:RIO DE JANEIRO
Organization Name (eg, company) [Internet Widgits Pty Ltd]:qintes
Organizational Unit Name (eg, section) []:qintes
Common Name (e.g. server FQDN or YOUR name) []:EdsonBelem
Email Address []:profedsonbelem@gmail.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:122128Belem@
An optional company name []:Qintess
```
## chave ssl
## decrypt file
## encrypt file

## decrypt file

## openssl

## Comandos de Criptografia
```cmd=
openssl pkeyutl -decrypt -inkey mykey.key -in C:\Users\edson\encripted_file.txt -out decrypted_file.txt
```
## backnode
### C:\Users\edson\projetofinal\backnode
## Gerar um arquivo auto assinado
### Arquivo gerado
```cmd=
openssl x509 -req -days 365 -in myrequest.csr -signkey mykey.key -out mycert.crt
```
## colocando a chave no java (ENTRAR NO MODO ADMINISTADOR CMD)...
```cmd=
"%JAVA_HOME%\bin\keytool" -import -alias mycert -keystore "%JAVA_HOME%\lib\security\cacerts" -file "c:\users\edson\mycert.crt" -storepass changeit
```

### Resultado
```cmd=
C:\Users\edson>"%JAVA_HOME%\bin\keytool" -import -alias mycert -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -file "c:\users\edson\mycert.crt" -storepass changeit
Owner: EMAILADDRESS=profedsonbelem@gmail.com, CN=EdsonBelem, OU=qintes, O=qintes, L=RIO DE JANEIRO, ST=RJ, C=BR
Issuer: EMAILADDRESS=profedsonbelem@gmail.com, CN=EdsonBelem, OU=qintes, O=qintes, L=RIO DE JANEIRO, ST=RJ, C=BR
Serial number: 23157e1cfbcb94abc5defc5bd0cfa1f97ffaa59c
Valid from: Mon Jun 24 02:42:08 BRT 2024 until: Tue Jun 24 02:42:08 BRT 2025
Certificate fingerprints:
SHA1: E3:65:C8:AF:E3:70:A5:3B:CA:AB:87:95:26:84:67:E2:90:AA:48:F1
SHA256: 2F:87:05:BB:A5:63:B5:A2:77:A8:7D:B1:D4:9B:42:96:D3:F9:52:34:B0:DE:4C:5F:4A:5A:EE:91:4A:E9:A9:9F
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 46 C5 38 C3 33 CF DB B1 96 CF 1C 73 C5 BE 28 07 F.8.3......s..(.
0010: B0 91 FD 1A ....
]
]
Trust this certificate? [no]: yes
Certificate was added to keystore
```
#### Gradle
```cmd=
C:\Users\edson\gradleproje>gradlew.bat build
BUILD SUCCESSFUL in 15s
5 actionable tasks: 4 executed, 1 up-to-date
C:\Users\edson\gradleproje>
```
### JBOSSS PARAR
```cmd=
sudo systemctl stop jboss.service
sudo systemctl status jboss.service
```
### Caminho Gradle
C:\Users\edson\gradleproje
C:\Users\edson\gradleproje\build\libs
## tomcat
C:\Users\edson\programas\apache9
```java=
MeuAppStruts2/
├── build.gradle
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── br/
│ │ │ └── com/
│ │ │ └── copergas/
│ │ │ ├── action/
│ │ │ ├── dao/
│ │ │ └── entity/
│ │ ├── resources/
│ │ └── webapp/
│ │ ├── WEB-INF/
│ │ │ ├── web.xml
│ │ │ └── struts.xml
│ │ ├── index.jsp
│ │ ├── welcome.jsp
│ │ ├── login.jsp
│ │ └── cadastro.jsp
│ ├── test/
│ │ ├── java/
│ │ │ └── br/
│ │ │ └── com/
│ │ │ └── copergas/
│ │ │ └── dao/
│ │ └── resources/
└── ...
```
### build.gradle
```java=
plugins {
id 'java'
id 'war'
id 'com.bmuschko.tomcat' version '2.7.0'
}
group = 'br.com.copergas'
repositories {
mavenCentral()
jcenter()
}
dependencies {
// Dependências do Struts2
implementation 'org.apache.struts:struts2-core:2.5.22'
implementation 'org.apache.struts:struts2-convention-plugin:2.5.22'
implementation 'org.apache.struts:struts2-json-plugin:2.5.22'
// Dependências adicionais como JSP API e Servlet API se necessário
implementation 'javax.servlet:javax.servlet-api:4.0.1'
implementation 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.3'
implementation 'jstl:jstl:1.2'
implementation 'org.springframework.security:spring-security-core:4.2.13.RELEASE'
// Dependências de teste
testImplementation 'junit:junit:4.13.2'
// Tomcat
tomcat "org.apache.tomcat.embed:tomcat-embed-core:9.0.65"
tomcat "org.apache.tomcat.embed:tomcat-embed-logging-juli:9.0.65"
tomcat "org.apache.tomcat.embed:tomcat-embed-jasper:9.0.65"
}
war {
archiveBaseName = 'gradleproje'
archiveVersion = '1.0.0'
}
sourceSets {
main {
java {
srcDirs = ['src/main/java']
}
resources {
srcDirs = ['src/main/resources', 'src/main/webapp']
}
}
test {
java {
srcDirs = ['src/test/java']
}
resources {
srcDirs = ['src/test/resources']
}
}
}
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds'
}
tomcat {
httpPort = 8085
contextPath = '/gradleproje'
}
```
### Comandos do gradle
```cmd=
gradle wrapper --gradle-version 6.4
gradlew clean
gradlew build --refresh-dependencies
gradlew build --refresh-dependencies
BUILD SUCCESSFUL in 3s
3 actionable tasks: 3 up-to-date
C:\Users\edson\gradleproje>
```
## Tomcat 9.5
### C:\Users\edson\programas\apache9
## localhost:8081
#### Tomcat 9.0.90

## Scoop
Power Shell
```cmd=
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
```
## Scoop
**scoop bucket add versions
scoop install versions/tomcat9**
```cmd=
## Atualizar o gradle
gradlew clean build --refresh-dependencies
gradlew clean build
## copiar parao tomcat
copy build\libs\gradleproje-1.0.0.war C:\Users\edson\programas\apache9\webapps
## Abrir o Browser
http://localhost:8086/gradleproje-1.0.0/
```

```java=
plugins {
id 'java'
id 'war'
}
group = 'br.com.copergas'
repositories {
mavenCentral()
jcenter()
}
dependencies {
// Dependências do Struts2
implementation 'org.apache.struts:struts2-core:2.5.22'
implementation 'org.apache.struts:struts2-convention-plugin:2.5.22'
implementation 'org.apache.struts:struts2-json-plugin:2.5.22'
// Dependências adicionais como JSP API e Servlet API se necessário
implementation 'javax.servlet:javax.servlet-api:4.0.1'
implementation 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.3'
implementation 'jstl:jstl:1.2'
implementation 'org.springframework.security:spring-security-core:4.2.13.RELEASE'
// Dependências de teste
testImplementation 'junit:junit:4.13.2'
}
war {
archiveBaseName = 'gradleproje'
archiveVersion = '1.0.0'
}
sourceSets {
main {
java {
srcDirs = ['src/main/java']
}
resources {
srcDirs = ['src/main/resources', 'src/main/webapp']
}
}
test {
java {
srcDirs = ['src/test/java']
}
resources {
srcDirs = ['src/test/resources']
}
}
}
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds'
}
```
## cadastro.jsp
```cmd=
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Cadastro de Usuários</title>
</head>
<body>
<h2>Cadastro de Usuários</h2>
<s:form action="register">
<s:textfield name="user.name" label="Nome" required="true"/>
<s:textfield name="user.email" label="Email" required="true"/>
<s:password name="user.password" label="Senha" required="true"/>
<s:textfield name="user.token" label="Token" required="true"/>
<s:submit value="Registrar"/>
</s:form>
</body>
</html>
```
### HelloAction.java
```java=
package br.com.copergas.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport{
private String message;
public String execute() {
setMessage("Hello, Struts2!");
return SUCCESS;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
```
## UsersAction.java
```java=
package br.com.copergas.action;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import br.com.copergas.dao.UsersDao;
import br.com.copergas.entity.Users;
import br.com.copergas.service.UsersServiceToken;
public class UsersAction extends ActionSupport {
private UsersDao userDao = new UsersDao();
private Users user;
private List<Users> users;
private UsersServiceToken tokenService = new UsersServiceToken();
private String token;
public String login() {
Users authenticatedUser = getUserDao().getUserByEmailAndPassword(getUser().getEmail(), getUser().getPassword());
if (authenticatedUser != null) {
setUser(authenticatedUser);
setToken((String) getTokenService().getGenerateTokenWithEmail(getUser().getEmail()));
return SUCCESS;
}
return ERROR;
}
public String list() {
setUsers(getUserDao().getAllUsers());
return SUCCESS;
}
public Users getUser() {
return user;
}
public void setUser(Users user) {
this.user = user;
}
public List<Users> getUsers() {
return users;
}
public void setUsers(List<Users> users) {
this.users = users;
}
public String register() {
try {
getUserDao().saveUser(getUser());
return SUCCESS;
} catch (Exception e) {
addActionError("An error occurred during registration: " + e.getMessage());
return ERROR;
}
}
public UsersDao getUserDao() {
return userDao;
}
public void setUserDao(UsersDao userDao) {
this.userDao = userDao;
}
public UsersServiceToken getTokenService() {
return tokenService;
}
public void setTokenService(UsersServiceToken tokenService) {
this.tokenService = tokenService;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
```
## AbstractDao
```java=
package br.com.copergas.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public abstract class AbstractDao {
private final String url = "jdbc:postgresql://localhost:5432/copergas";
private final String user = "postgres";
private final String password = "root1";
static {
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
System.out.println("PostgreSQL JDBC Driver not found. Include it in your library path.");
e.printStackTrace();
}
}
protected Connection getConnection() throws Exception {
return DriverManager.getConnection(url, user, password);
}
protected void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
System.out.println("Failed to close connection: " + e.getMessage());
}
}
}
}
```
UsersDao.java
```java=
package br.com.copergas.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import br.com.copergas.entity.Users;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
public class UsersDao extends AbstractDao {
private final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
public Users getUserByEmailAndPassword(String email, String password) {
String sql = "SELECT id, name, email, password, token FROM users WHERE email = ?";
Connection conn = null;
try {
conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, email);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
Users user = extractUserFromResultSet(rs);
if (encoder.matches(password, user.getPassword())) {
return user;
}
}
} catch (SQLException e) {
System.out.println("Query failed: " + e.getMessage());
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
} finally {
closeConnection(conn);
}
return null;
}
public void saveUser(Users user) {
String sql = "INSERT INTO users(name, email, password, token, status) VALUES(?,?,?,?,?)";
Connection conn = null;
try {
conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getName());
pstmt.setString(2, user.getEmail());
String hashedPassword = encoder.encode(user.getPassword());
pstmt.setString(3, hashedPassword);
pstmt.setString(4, "");
pstmt.setString(5, "ACTIVE");
pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println("Insert failed: " + e.getMessage());
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
} finally {
closeConnection(conn);
}
}
private Users extractUserFromResultSet(ResultSet rs) throws Exception {
Users user = new Users();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
user.setPassword(rs.getString("password"));
user.setToken(rs.getString("token"));
user.setStatus(rs.getString("status"));
return user;
}
public List<Users> getAllUsers() {
List<Users> users = new ArrayList<>();
String sql = "SELECT * FROM users";
Connection conn = null;
try {
conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
users.add(extractUserFromResultSet(rs));
}
} catch (SQLException e) {
System.out.println("Query failed: " + e.getMessage());
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
}
return users;
}
public void updateUser(Users user) {
String sql = "UPDATE users SET name = ?, email = ?, password = ?, token = ? , status =? WHERE id = ?";
Connection conn = null;
try {
conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getName());
pstmt.setString(2, user.getEmail());
pstmt.setString(3, user.getPassword());
pstmt.setString(4, user.getToken());
pstmt.setString(5, user.getStatus());
pstmt.setInt(6, user.getId());
pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println("Update failed: " + e.getMessage());
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
}
}
public void deleteUser(int id) {
String sql = "DELETE FROM users WHERE id = ?";
Connection conn = null;
try {
conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println("Delete failed: " + e.getMessage());
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
}
}
public Users getUserById(int userId) {
String sql = "SELECT id, name, email, password, token, status FROM users WHERE id = ?";
Connection conn = null;
try {
conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, userId);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
return extractUserFromResultSet(rs);
}
} catch (SQLException e) {
System.out.println("Query failed: " + e.getMessage());
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
} finally {
closeConnection(conn);
}
return null;
}
}
```
## struts.xml
```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" namespace="/" extends="struts-default">
<action name="login" class="br.com.copergas.action.UsersAction" method="login">
<result name="success">/welcome.jsp</result>
<result name="error">/login.jsp</result>
<result name="input">/login.jsp</result>
</action>
<action name="register" class="br.com.copergas.action.UsersAction" method="register">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="list" class="br.com.copergas.action.UsersAction" method="list">
<result name="success">/listagem.jsp</result>
</action>
<action name="hello" class="br.com.copergas.action.HelloAction">
<result>/hello.jsp</result>
</action>
</package>
</struts>
```
### web.xml
```java=
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
version="4.0">
<display-name>Struts 2 Web Application</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.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>
```
## cadastro.jsp
```java=
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Cadastro de Usuários</title>
</head>
<body>
<h2>Cadastro de Usuários</h2>
<s:form action="register">
<s:textfield name="user.name" label="Nome" required="true"/>
<s:textfield name="user.email" label="Email" required="true"/>
<s:password name="user.password" label="Senha" required="true"/>
<s:submit value="Registrar"/>
</s:form>
</body>
</html>
```
## login.jsp
```java=
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Login de Users</title>
</head>
<body>
<h2>Login de Users</h2>
<s:form action="login">
<s:textfield name="user.email" label="Email" required="true"/>
<s:password name="user.password" label="Senha" required="true"/>
<s:submit value="Login"/>
</s:form>
<s:if test="token != null">
<p>Login successful! Your token is: <s:property value="token"/></p>
</s:if>
<s:if test="hasActionErrors()">
<s:actionerror/>
</s:if>
</body>
</html>
```
### build.gradle
### Spring Security com Struts2
```java=
plugins {
id 'java'
id 'war'
}
group = 'br.com.copergas'
repositories {
mavenCentral()
jcenter()
}
dependencies {
// Dependências do Struts2
implementation 'org.apache.struts:struts2-core:2.5.22'
implementation 'org.apache.struts:struts2-convention-plugin:2.5.22'
implementation 'org.apache.struts:struts2-json-plugin:2.5.22'
// Dependências adicionais como JSP API e Servlet API se necessário
implementation 'javax.servlet:javax.servlet-api:4.0.1'
implementation 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.3'
implementation 'jstl:jstl:1.2'
implementation 'org.springframework.security:spring-security-core:4.2.13.RELEASE'
implementation 'org.postgresql:postgresql:42.2.20'
implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
implementation 'io.jsonwebtoken:jjwt-impl:0.11.2'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.2'
// Dependências de teste
testImplementation 'junit:junit:4.13.2'
}
war {
archiveBaseName = 'gradleproje'
archiveVersion = '1.0.0'
}
sourceSets {
main {
java {
srcDirs = ['src/main/java']
}
resources {
srcDirs = ['src/main/resources', 'src/main/webapp']
}
}
test {
java {
srcDirs = ['src/test/java']
}
resources {
srcDirs = ['src/test/resources']
}
}
}
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds'
}
```

```cmd=
## Atualizar o gradle
gradlew clean build --refresh-dependencies
gradlew clean build
## copiar parao tomcat
copy build\libs\gradleproje-1.0.0.war C:\Users\edson\programas\apache9\webapps
## Abrir o Browser
http://localhost:8086/gradleproje-1.0.0/
```



## Struts2 Funcionando com Spring Security