Мой класс действий отображается без сопоставлений Struts.xml или Java-аннотаций
У меня есть страница входа в JSP, которая будет вызывать класс действий входа в систему. Я использовал аннотации Struts, а не struts.xml
на карту и все работало нормально. Я случайно пробовал что-то новое, поэтому я удалил все аннотации из своего класса действий и struts.xml
пока что нет картирования login.jsp
может назвать мой класс действий. Как это возможно, что мой класс действий вызывается без Struts.xml
Конфигурация или аннотации стоек используются?
login.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Welcome to Popular Movies</title>
<style type="text/css">
.errors {
background-color:#FFCCCC;
border:1px solid #CC0000;
width:400px;
margin-bottom:8px;
}
.errors li{
list-style: none;
}
</style>
</head>
<body>
<h2>Please Log in</h2>
<div id="errorMessage" >
<s:if test="hasActionErrors()">
<div class="errors" >
<s:actionerror/>
</div>
</s:if>
</div>
<s:form action="login" method="post" name="myForm" onSubmit="return preValidate(errorMessage, userName, userPassword)" >
<s:textfield name="userName" label="Name" size="20" id="userName" />
<s:password name="password" label="Password" size="20" id="userPassword" />
<s:hidden name="registration" value="false" />
<s:submit value="Submit" align="center" />
</s:form>
<hr>
<a href="/PopularMovies/registration.jsp">Sign up free</a>
</body>
<script type="text/javascript" src="validation.js">
</script>
</html>
Login.java
package com.esi.actions;
import com.opensymphony.xwork2.ActionSupport;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.sans.model.Movie;
import com.sans.model.Movies;
import com.sans.model.user_account;
import org.hibernate.HibernateException;
import org.hibernate.Query;
@SuppressWarnings("serial")
public class Login extends ActionSupport {
private String password;
private String userName;
private String email;
private String firstName;
private String lastName;
private String registration;
private static SessionFactory sessionFactory;
@SuppressWarnings("deprecation")
public String execute() {
boolean isRegistration = Boolean.parseBoolean(registration);
System.out.println("Action called from struts.xml");
try {
//Setting up Hibernate configuration
System.out.println("Attempting Database connection...");
sessionFactory = new Configuration().configure().buildSessionFactory();
}
catch(Exception ex){
System.out.println("Failed to create sessionFactory object. " + ex.toString());
return INPUT;
}
// If Registration flag is set to true then it means user is trying to register
// else authenticate user
if(isRegistration) {
if(this.addUser()) {
return SUCCESS;
}
else {
return INPUT;
}
}
else {
if(this.authenticateUser(this.getUserName())) {
return SUCCESS;
}
else {
return INPUT;
}
}
}
public boolean addUser() {
boolean result = false;
user_account user = new user_account();
user.setUser_Name(this.getUserName());
user.setFirstName(this.getFirstName());
user.setLastName(this.getLastName());
user.setEmail(this.getEmail());
user.setUser_Password(this.getPassword());
Session session = sessionFactory.openSession();
try{
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
result = true;
addActionMessage("Welcome " + user.getUser_Name());
}
catch(HibernateException e){
if(session.getTransaction() != null)
session.getTransaction().rollback();
System.out.println("Error trying to insert user to database.. " + e.getMessage() + "\nStack Trace: ");
e.printStackTrace();
}
finally {
session.close();
}
return result;
}
public boolean authenticateUser(String userName) {
boolean result = false;
Session session = sessionFactory.openSession();
try{
session.beginTransaction();
String hql = "FROM user_account U WHERE U.User_Name = :userName";
Query query = session.createQuery(hql);
query.setParameter("userName", userName);
List results = query.list();
//If the query result size is 0, then it means user does not exist in database
if(results.size() != 0) {
user_account user = (user_account)results.get(0);
if(this.getUserName().equals(user.getUser_Name()) && this.getPassword().equals(user.getUser_Password())) {
addActionMessage("Welcome " + user.getUser_Name());
result = true;
}
else {
addActionError("Invalid User");
result = false;
}
}
else {
addActionError("Invalid User");
result = false;
}
session.getTransaction().commit();
}
catch(HibernateException e){
if(session.getTransaction() != null)
session.getTransaction().rollback();
System.out.println("Error trying to insert user to database.. " + e.toString());
}
catch(IndexOutOfBoundsException e) {
}
catch(Exception ex) {
System.out.println("Something went wrong: " + ex.toString());
}
finally {
session.close();
}
return result;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getRegistration() {
return registration;
}
public void setRegistration(String registration) {
this.registration = registration;
}
}
Struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<action name="login" class="com.esi.actions.Login">
<result name="success">/success.jsp</result>
</action>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>PopularMovies</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
Из того, что я знаю из структуры Struts, класс действий может быть вызван, только если он был отображен в struts.xml или с использованием аннотаций.
2 ответа
В Struts2 аннотации предоставляются плагином Convention.
Название говорит само за себя: соглашение над конфигурацией.
Это означает, что вы можете настроить каждый его аспект, но он также будет работать по умолчанию, если вы будете следовать определенным соглашениям; Таким образом, вы должны тратить время на настройку только тех случаев, которые отличаются от стандартного поведения.
По умолчанию плагин Convention находит все классы действий, которые реализуют com.opensymphony.xwork2.Action или имя которых заканчивается словом Action в определенных пакетах.
Эти пакеты находятся в плагине Convention с использованием методологии поиска. Сначала плагин Convention находит пакеты с именами struts, struts2, action или actions. Любые пакеты, соответствующие этим именам, считаются корневыми пакетами для плагина Convention. Затем плагин просматривает все классы в этих пакетах, а также подпакеты и определяет, реализуют ли классы com.opensymphony.xwork2.Action или заканчивается ли их имя на Action (т.е. FooAction). Вот пример нескольких классов, которые найдет плагин Convention:
Classes com.example.actions.MainAction com.example.actions.products.Display (implements com.opensymphony.xwork2.Action) com.example.struts.company.details.ShowCompanyDetailsAction
Вы расширяете ActionSupport, который реализует интерфейс Action... следовательно, даже если он не настроен, login
действие будет найдено.
РЕДАКТИРОВАТЬ
Я забыл упомянуть, что существует плагин, который поможет вам отладить конфигурации действий / перехватчиков / результатов: плагин для браузера Struts2 Config. Просто включите JAR в ваш WAR/EAR и позвоните
http://YOUR_DOMAIN/YOUR_WEBAPP/config-browser/index.action
Вы будете иметь четкое представление о каждом действии, настроенном (неявно через соглашение или явно через конфигурацию) в вашем веб-приложении.
Не забудьте УДАЛИТЬ ЭТОГО ПЛАГИНА перед развертыванием в Производстве, иначе у злоумышленников будет (намного) больше шансов поразить вас.
Я не использовал Struts в течение долгого времени, интересно, использует ли он имя класса для сопоставления, попробуйте один из следующих вариантов, чтобы увидеть, правильно это или нет:
1- Изменить действие ="логин" на действие ="логин2"
ИЛИ ЖЕ
2- Измените имя класса на Login2
И посмотри, работает это или нет!!