struts2的一些小问题
这是我的sturts2的命名方式图片
部分jsp的代码(adminLogin.jsp)
<%--
Created by IntelliJ IDEA.
User: AAA
Date: 2021/2/25
Time: 21:13
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<title>Title</title>
</head>
<body>
<s:form action="login">
<s:textfield name="user" label="name"/>
<s:textfield name="user" label="password"/>
<s:submit value="Submit"/>
</s:form>
</body>
</html>
部分action的代码(AdminLogin)
package com.admin;
import com.User;
public class AdminLogin {
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
private User user;
public String getDefaultUsername() {
return defaultUsername;
}
public void setDefaultUsername(String defaultUsername) {
this.defaultUsername = defaultUsername;
}
public String getDefaultPassword() {
return defaultPassword;
}
public void setDefaultPassword(String defaultPassword) {
this.defaultPassword = defaultPassword;
}
private String defaultUsername;
private String defaultPassword;
public String execute()
{ try{
if(user.getUsername().equals(defaultUsername) && user.getPassword().equals(defaultPassword))
{
return "success";
}
else
{
return "login";
}
}
catch (Exception e)
{
e.printStackTrace();
return "login";}
}
}
struts2的配置
<?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>
<constant name="struts.action.extension" value="jspx"></constant>
<constant name="struts.i18n.encoding" value="GBK"></constant>
<constant name="struts.serve.static.browserCache" value="false"/>
<constant name="struts.configuration.xml.reload" value="true"/>
<package name="/admin" extends="struts-default" namespace="/admin">
<action name="login" class="com.admin.AdminLogin" method="execute">
<param name="defaultUsername">testadmin</param>
<param name="defaultPassword">123</param>
<result name="success">hello.jsp</result>
<result name="login">adminLogin.jsp</result>
</action>
</package>
<!-- Add packages here -->
<package name="/user" extends="struts-default" namespace="/user">
<action name="login" class="com.users.UsersLogin" method="execute">
<param name="defaultUsername">testuser</param>
<param name="defaultPassword">123</param>
<result name="success">hello.jsp</result>
<result name="login">userLogin.jsp</result>
</action>
</package>
<package name="/default" extends="struts-default">
<action name="login" class="com.DefaultLogin" method="execute">
<result name="redirect" type="redirectAction">
<param name="user.username">${user.username}</param>
<param name="user.password">${user.password}</param>
<param name="actionName">login</param>
<param name="namespace">/user</param>
</result>
</action>
</package>
<!-- Add packages here -->
</struts>
xwork的配置(User类对应使用UserConverter这个转换器)
com.User=com.UserConverter
转换器代码
package com;
import ognl.DefaultTypeConverter;
import java.util.Map;
public class UserConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
if(toType == User.class)
{
String[]params = (String[])value;
User w = new User();
w.setUsername(params[0]);
w.setPassword(params[1]);
return w;
}
return null;
}
}
下面是我关于struts2的一些心得:
1.关于action的重定向解决办法
1.<package name="/default" extends="struts-default">
2. <action name="login" class="com.DefaultLogin" method="execute">
3. <result name="redirect" type="redirectAction">
4. <param name="user.username">${user.username}</param>
5. <param name="user.password">${user.password}</param>
6. <param name="actionName">login</param>
7. <param name="namespace">/user</param>
8. </result>
9. </action>
10. </package>
通过actionName和namespace来访问 /user/login 而且要将之前的值传过去,不然在/user/login.action中会因为execute中的字符串相等equal()的方法报错——因为没有值的话就会为空,值为空的时候就会报错
<constant name="struts.configuration.xml.reload" value="true"/>
这个语句并不能让我自动加载struts.xml
3.关于访问网页的时候
输入http://localhost:8088/SSH_Project_2_war_exploded/admin/aaa/login.jspx的时候会报错,因为struts2会让你进入到以/admin为namespace下去找,但是却找不到/aaa/login.jspx这个文件所以会报404.但是当你输入http://localhost:8088/SSH_Project_2_war_exploded/admi/aaa/login.jspx的时候,因为namespace中没有/admi,也没有/aaa这些命名空间,所以会直接选择默认的命名空间default,就会跳转到login.jspx,测试中的/error/login.jspx,就是因为没有找到/error这个namespace,所以自动跳转到命名空间为default的namespace.下面图片是输入/error/login.jspx时候自动跳转默认命名空间的action中
4.关于为什么Jsp中的user可以直接知道他就是一个User类
因为struts2是已经加载的了(而不是边运行边加载,类似于玩游戏的时候一些东西加载了,但是其他东西要用的时候才加载),user已经在action中定义为了User类,所以在jsp中的name=”user”
会被认为是User类。
5.为什么action中可以直接获取到网页中输入的值
Struts2中的action如果配置了get和set方法后能够从自动外部注入值,不需要通过request获取。
6.判断是不是User类的时候要用到xwork来配置
7.在action执行方法的时后最好用try和catch不然出现未知异常的时候会报错。
public String execute()
{
try{
if(user.getUsername().equals(defaultUsername) && user.getPassword().equals(defaultPassword))
{
return "success";
}
else
{
return "login";
}
}
catch (Exception e)
{
e.printStackTrace();
return "login";}
}