实例分析Struts的由来和概述

    框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。
 
   Struts是基于MVC的框架,主要用来解决web上的一些问题。Struts只能应用在web项目,普通的java程序项目Struts用不了。
 
   MVC:V代表了视图,主要用于显示;C代表了控制,最典型的是使用了一个servlet,它可以做参数的获取,关系模型的调用和转向。Struts是将这些流程进行了封装,因为之前控制器接受的参数(一般都是字符串类型的)都必须需要转成相对应的类型(比如:int类型、String类型等)。所以基于这些原因,Struts将某些功能进行提取,然后做了一个封装,能让我们更好的使用。
 
   以示例分析,看下面示例。
   一个用户登录的示例。
   以下代码摘自testServlet示例中的TestServlet.java文件。
 
if("/servlet/delUser".equals(path))//如果是删除,以下做删除的事情
{
userManager.del(username);
request.getRequestDispatcher("/del_success.jsp").forward(request,response);
}else if("/servlet/addUser".equals(path))//如果是添加,以下做添加的事情
{
userManager.add(username);
request.getRequestDispatcher("/add_success.jsp").forward(request,response);
}else if("/servlet/queryUser".equals(path))
{
List userList= userManager.query(username);
request.setAttribute("userList", userList);//把userList设进去
request.getRequestDispatcher("/query_success.jsp").forward(request,response);
}else if("/servlet/modifyUser".equals("modify"))
{
userManager.modify(username);
request.getRequestDispatcher("/modify_success.jsp").forward(request,response);
}else
{
throw new RuntimeException("请求失败"); 
} 
 
   分析:此段代码完成的功能是得到用户名username,根据用户名进行相应的操作,并转向相应的页面。
假如我要改需求,需要增加一个页面,则需要打开代码进行修改,这样改来改去,就不符合OCP原则(Open-Close principle,简称OCP原则,即对扩展开发、对修改关闭)了,经常需要改程序才能适应需求。而且还有一个缺点,就是文件中的文件名称,比如:add_success.jsp、del_success.jsp、等等这些东西都写死了,比如想换一个文件名不同的文件以显示不同的文件内容,因为文件名都已经写死在了程序中,改动起来很麻烦,这也是作为程序开发人员来说最大的弊病。
   其实这些随时可变动的东西都可以拿出来,包括if语句也应该去掉,因为if不稳定,会随着需求的变动而改动,所以可以将这一部分拿出来,拿出来的话,就变的灵活了,想用什么配置一下就可以了。比如想改jsp名,只需要配置一下就可以了。抽取出来的这一部分就叫做基础性的服务,谁都可以使用,因此这就叫做一个框架。
因为if语句的不稳定性,需求如果需要增加或删除一条的if的话,则需要在if语句中进行修改。所以它适应需求的能力就比较差。所以我们需要把它完善一下——>看下面分析。
 
   首先看上面的代码存在冗余情况,
 
request.getRequestDispatcher("/modify_success.jsp").forward(request,response);

   这句代码几乎完全相同,重复了很多次。修改后为以下代码:
String forward="";
if("/servlet/delUser".equals(path))//如果是删除,以下做删除的事情
{
userManager.del(username);
forward="/del_success.jsp";
}else if("/servlet/addUser".equals(path))//如果是添加,以下做添加的事情
{
userManager.add(username);
forward="/add_success.jsp";
}else if("/servlet/queryUser".equals(path))
{
List userList= userManager.query(username);
request.setAttribute("userList", userList);//把userList设进去
forward="/query_success.jsp";
}else if("/servlet/modifyUser".equals("modify"))
{
userManager.modify(username);
forward="/modify_success.jsp";
}else
{
throw new RuntimeException("请求失败"); 
}
request.getRequestDispatcher(forward).forward(request,response); 

   进一步分析此示例,看下面类图:
 
   类图说明:抽象出一个接口Action,其他的类去实现这个类,实现不同的多态,TestServlet充当前端控制器,它的职责有两点:1.根据相应的规则截取URL,2.根据URL分发到相应的Action。
   其他的四个实现类(每一个业务请求)都是一个小的控制器,因为在这里面也做了参数的获取,做了调用相应的模型层(比如Manager)的业务逻辑的调用,然后把转向信息给了TestServlet中央控制器来完成统一转向。大部分的MVC的框架都是这样一个东西,比如struts,大致思路都是这样的。
   用时序图来分析此框架:
 
 
   首先是用户请求客户端浏览器,然后访问到testServlet,testservlet是一个前端控制器,所以我们要请求到一个前端控制器上,testServlet在tomcat上,所以访问tomcat(或者类似tomcat的前端控制器),然后访问前端控制器(TestServlet),调用doget或dopost方法(本实例中这两个方法都已经写了),Servlet自己做的事情有5截取URL和6根据URL分发到相应的Action,7读取配置文件找到相应的Action。
   将Action里面的转向路径通过配置文件来读取。这样的话,所有的东西都是可配置的,if...else...就没有了,如果添加功能的话,只要写配置文件就可以了,采用反射动态的实例化即可,大大的增加了灵活性。
 
   以上就是Struts框架的由来和简单概述。
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/CharmingDang/archive/2012/06/06/9663937.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值