Struts功能详解——Action

Action是struts中的一个抽象类,它其实是Struts的心脏部分,前面提到的ActionServlet和ActionForm进过处理获取的请求和数据,都会到达Action中得到分发。

一:Action有那些作用

  1. 可以进行一些表单数据的检查,这里面的检查一般和页面的检查是不一样的,页面的检查都是客户端的一些数据格式规范的检查,这里的检查而与业务相关的检查一般放到这里面检查,比如与JavaBean相关的一些操作。也可以说它是一个业务逻辑的管理分发的地方。
  2. 执行必要的业务逻辑,不如存取数据库,调用实体bean等。它会直接调用业务逻辑层的javabean去处理数据库的操作,比如增删改查等。
  1. 根据处理的结果决定程序的去向,并以ActionForward对象的形式传递给ActionServlet,这样ActionServlet通过配置文件,决定返回的数据到达那个页面。
  1. Action是一个抽象类,必须实现以后才能执行,执行的方法是execute方法。

二 :一个完整的Action示例和执行流程。

<actionpath="/aFullAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forwardname="successful" path="someJSP.jsp"/>
<forwardname="failed" path="someOtherJSP.jsp"/>
</action>

Action执行流程

首先,Struts的ActionServlet接收到一个请求,然后根据struts-config.xml的配置定位到相应的mapping(映射);接下来如果form的范围是request或者在定义的范围中找不到这个form,创建一个新的form实例;取得form实例以后,调用其 reset()方法,然后将表单中的参数放入form,如果validate属性不为false,调用validate()方法;如果validate()返回非空的ActionErrors,将会被转到input属性指定的URI,如果返回空的ActionErrors,那么执行Action的 execute()方法,根据返回的ActionForward确定目标URI。

这样做的效果是:execute()仅当validate()成功以后才执行;input属性指定的是一个URI。

三.一个特殊的Action:DispatchAction

由于当业务太多的时候,每个业务都要创造一个Action,这样会大大增加Action的数量,而且也会造成浪费。

它的主要好处就是把所有的Action放到一个类里面,通过传过来的参数决定调用那个Action操作。

DispatchAction类是一个抽象类,它实现了父类(Action)的execute()方法,所以它的子类就不用来实现这个方法了,只需要专注与实际操作的方法。

下面看一个dispatchAction应用实例。

1.首先要一个DispatchAction的子类,它含有一些方法,login,logout,method1,

public class AccountAction extends DispatchAction {
    public ActionForward login(ActionMapping mapping,
                              ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response)
    throws Exception {
        // 進行一些Login的逻辑
              return mapping.findForward("success");  
 
    }
                                                                               
    public ActionForward logout(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        // 進行一些Logout的逻辑
              return mapping.findForward("success1");  
 
    }
    public ActionForward method1(ActionMapping mapping,
                                ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        // 進行一些method1的逻辑
              return mapping.findForward("success");  
    }
}


一定要注意在DispatchAction中你想执行的操作,都必须要有统一的参数(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse),是一个规定.

2.接下来是配置struts-config.xml

 <action path="/login"  type="examples.AccountAction" 
             name="logonForm"
             scope="request"
             parameter="action"
             input="/pages/dispatch1.jsp">
       <forward name="success" path="/pages/success.jsp" />
    </action>
 
    <action path="/logout"  type="examples.AccountAction" 
             name="logonForm"
             scope="request"
             parameter="action"
             input="/pages/dispatch1.jsp">
       <forward name="success1" path="/pages/success1.jsp" />
    </action>

这里需要注意的就是parameter属性的值,因为这个值要和页面传来的参数对应.

3.再来看看JSP页pages/dispatch1.jsp

 
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<html:link href="/DispathActionTest/login.do?action=login">login</html:link><br>
<html:link href="/DispathActionTest/logout.do?action=logout">logout</html:link>

这里要注意几点,首先?后面的KEY要和struts-config.xml中的parameter相同,还有它的VALUE要是你在action的一个方法名字,这里方法名为login,那么在程序运行时就是调用login的操作,如果是logout,那程序就调用logout的操作.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于 Struts2 和 Hibernate 的登录和注册的完整实例。 首先,需要创建一个名为 `User` 的 JavaBean 类,用于表示用户信息: ```java public class User { private int id; private String username; private String password; // getters and setters } ``` 接下来,需要配置 Hibernate 的 `SessionFactory`,以便在操作数据库时使用。可以在 `hibernate.cfg.xml` 文件中进行配置: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://localhost:3306/test?useSSL=false</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <mapping class="com.example.User"/> </session-factory> </hibernate-configuration> ``` 接着,需要创建一个名为 `UserDao` 的类,用于操作数据库。在该类中,需要使用 Hibernate 的 API 进行增删改查操作: ```java public class UserDao { private SessionFactory sessionFactory; public UserDao() { Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } public void addUser(User user) { Session session = sessionFactory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); session.save(user); tx.commit(); } catch (HibernateException e) { if (tx != null) { tx.rollback(); } e.printStackTrace(); } finally { session.close(); } } public User getUserByUsername(String username) { Session session = sessionFactory.openSession(); Transaction tx = null; User user = null; try { tx = session.beginTransaction(); Query query = session.createQuery("from User where username = :username"); query.setString("username", username); user = (User) query.uniqueResult(); tx.commit(); } catch (HibernateException e) { if (tx != null) { tx.rollback(); } e.printStackTrace(); } finally { session.close(); } return user; } } ``` 然后,需要创建一个名为 `UserAction` 的类,用于处理用户登录和注册的请求。在该类中,需要使用 Struts2 的 API 进行请求处理: ```java public class UserAction extends ActionSupport { private User user; private String confirmPassword; private UserDao userDao = new UserDao(); public String login() { User savedUser = userDao.getUserByUsername(user.getUsername()); if (savedUser == null || !savedUser.getPassword().equals(user.getPassword())) { addActionError("Invalid username or password!"); return INPUT; } return SUCCESS; } public String register() { if (!user.getPassword().equals(confirmPassword)) { addActionError("Passwords don't match!"); return INPUT; } User savedUser = userDao.getUserByUsername(user.getUsername()); if (savedUser != null) { addActionError("Username already exists!"); return INPUT; } userDao.addUser(user); return SUCCESS; } // getters and setters } ``` 最后,需要在 `struts.xml` 文件中进行配置,以便 Struts2 能够正确地处理请求: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true"/> <package name="default" extends="struts-default"> <action name="login" class="com.example.UserAction" method="login"> <result name="success">/success.jsp</result> <result name="input">/login.jsp</result> </action> <action name="register" class="com.example.UserAction" method="register"> <result name="success">/success.jsp</result> <result name="input">/register.jsp</result> </action> </package> </struts> ``` 其中,`success.jsp` 是登录或注册成功后显示的页面,`login.jsp` 和 `register.jsp` 分别是登录和注册的页面。 这样,基于 Struts2 和 Hibernate 的登录和注册功能的完整实例就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值