Struts2 MVC架构php
模型视图控制器(Model View Controller)或MVC,MVC是俗称。是一种软件设计模式,用于开发Web应用程序。模型 - 视图 - 控制器模式是由下面三个部分组成:html
Model - 模型是负责维护数据最低级别。java
View - 这是负责向用户显示的全部或部分数据。mysql
Controller - 软件代码。控制模型和视图之间的相互做用。web
MVC是受欢迎的,因为它从用户界面层,应用逻辑隔离,并支持关注点分离。在这里,控制器接收所有请求的应用和模型准备视图所需要的不论什么数据。ajax
查看,而后使用编制的数据由控制器生成终于像样的回应。spring
MVC抽象可以以图形方式显演示样例如如下。sql
该模型是负责管理应用程序的数据。它响应视图的请求,也响应从控制器的指示进行自我更新。数据库
在一个特定格式的数据,一个演示控制器的决定,显示数据所引起的。express
他们是基于脚本的模板系统,如JSP,ASP。PHP,并且很是easy整合AJAX技术。
该控制器负责响应用户输入和运行数据模型对象的相互做用。控制器接收输入,验证输入。而后进行业务操做,改动数据模型的状态。
Struts2与Spring集成
Spring是一个流行的Web框架,它提供易于集成与很是多常见的网络任务。因此,问题是。为何咱们需要Spring。当咱们有Struts2?Spring是超过一个MVC框架 - 它提供了不少其余好用的东西,这是否是在Struts。
好比:依赖注入可以是实用的不论什么框架。在本章中。咱们将经过一个简单的样例来看看怎样集成Spring和Struts2一块儿。
首先。需要加入下列文件到项目的构建路径从Spring安装。
您可以下载并安装最新版本号的Spring框架从 http://www.springsource.org/download
org.springframework.asm-x.y.z.M(a).jar
org.springframework.beans-x.y.z.M(a).jar
org.springframework.context-x.y.z.M(a).jar
org.springframework.core-x.y.z.M(a).jar
org.springframework.expression-x.y.z.M(a).jar
org.springframework.web-x.y.z.M(a).jar
org.springframework.web.servlet-x.y.z.M(a).jar
最后增长struts2-spring-plugin-x.y.z.jar在WEB-INF/lib从struts的lib文件夹。假设使用的是Eclipse,那么可能会面临一个异常的java.lang.ClassNotFoundException异常:org.springframework.web.context.ContextLoaderListener。
为了解决问题,应该在一类依赖的标记标签右上点击高速修复公布/导出所有的依赖关系。最后,确保不存在依赖冲突标记“选项卡下。
现在让咱们来设置web.xml中的Struts-Spring集成例如如下:
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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>Struts 2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
这里要注意的最重要的事情是咱们已经配置了监听器。 ContextLoaderListener的需要载入Spring上下文文件。
Spring的配置文件名称为applicationContext.xml文件。它必须放置在同一水平web.xml文件
让咱们建立一个简单的动做类称为User.java的两个属性 - firstName和lastName。
package com.yiibai.struts2; public class User { private String firstName; private String lastName; public String execute() { return "success"; } 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; } }
现在。让咱们一块儿创造了applicationContext.xml spring 配置文件并建立实例User.java类。正如前面提到的,这个文件应该在WEB-INF目录下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="userClass" class="com.yiibai.struts2.User"> <property name="firstName" value="Michael" /> <property name="lastName" value="Jackson" /> </bean> </beans>
正如上面看到的。咱们已经配置了用户bean,咱们放值Michael和Jackson到bean。咱们也给这个bean名称“userClass”,这样咱们就可以重用在其它地方。接下来,让咱们在WebContent目录中建立由user.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> <title>Hello World</title> </head> <body> <h1>Hello World From Struts2 - Spring integration</h1> <s:form> <s:textfield name="firstName" label="First Name"/><br/> <s:textfield name="lastName" label="Last Name"/><br/> </s:form> </body> </html>
由user.jsp文件至关直接。
它仅仅有一个目的 - 显示的名字和姓氏的用户对象的值。最后,让咱们把所有的实体一块儿使用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> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="user" class="userClass" method="execute"> <result name="success">/User.jsp</result> </action> </package> </struts>
重要的是要注意的是,咱们使用id userClass的引用类。这意味着。咱们使用的是spring 作的User类的依赖注入。
现在右击项目名称,并单击Export > WAR File建立一个WAR文件。而后部署这个WAR在Tomcat的webapps文件夹下。
最后,启动Tomcatserver和尝试訪问URL http://localhost:8080/HelloWorldStruts2/User.jsp。这会给你下面画面:
现在咱们已经看到了怎样将两个伟大的框架 Struts - Spring集成。
Struts2和Hibernate集成
Hibernate是一个高性能的对象/关系持久性和查询服务许可下的开源GNU通用公共许可证(LGPL),并免费下载。
在这一章中,咱们要学习怎样实现Struts2与Hibernate集成。假设你不熟悉与Hibernate,那么可以查看咱们的Hibernate教程。
在本教程中,我会使用“struts2_tutorial”MySQL数据库。
我链接到个人机器上使用这个数据库的username“root”,并且没有password。首先,你需要执行如下的脚本。此脚本建立称为student ,并建立一个新的表,此表中的记录数:
CREATE TABLE IF NOT EXISTS `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(40) NOT NULL, `last_name` varchar(40) NOT NULL, `marks` int(11) NOT NULL, PRIMARY KEY (`id`) ); -- -- Dumping data for table `student` -- INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`) VALUES(1, 'George', 'Kane', 20); INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`) VALUES(2, 'Melissa', 'Michael', 91); INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`) VALUES(3, 'Jessica', 'Drake', 21);
接下来让咱们建立这是Hibernate的配置文件hibernate.cfg.xml中。
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">c om.mysql.jdbc.Driver </property> <property name="hibernate.connection.url"> jdbc:mysql://www.yiibai.com/struts_tutorial </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <property name="hibernate.connection.pool_size">10</property> <property name="show_sql">true</property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping class="com.yiibai.hibernate.Student" /> </session-factory> </hibernate-configuration>
让咱们经过hibernate的配置文件。首先,咱们正在使用的MySQL驱动程序。而后,咱们声明 JDBC URL链接到数据库。
而后,声明链接的username,password以及池的大小。咱们也表示,咱们但愿“show_sql”转向真正看到SQL的日志文件里。请通过Hibernate教程。了解这些属性是什么意思。最后,咱们设置了的映射类com.yiibai.hibernate.Student。咱们将本章中建立。
接下来。这个项目需要一大堆的jar文件。附所需的JAR文件的完整列表的截图:
大部分的JAR文件可以做为Struts的分布的一部分。
假设有一个如GlassFish应用server,WebSphere或JBoss安装。那么可以获得的大部分jar文件从应用server的lib目录。假设没有,可以单独下载的文件:
Hibernate jar files - Hibernate.org
Struts hibernate plugin - Struts hibernate plugin
JTA files- JTA files
Dom4j files - Dom4j
SLF4J files - SLF4J
log4j files - log4j
其他的文件,应该能够从struts2的分发获得。
现在让咱们来建立Hibernate集成所需的Java类。下面内容Student.java:
package com.yiibai.hibernate; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="student") public class Student { @Id @GeneratedValue private int id; @Column(name="last_name") private String lastName; @Column(name="first_name") private String firstName; private int marks; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public int getMarks() { return marks; } public void setMarks(int marks) { this.marks = marks; } }
这是一个POJO类,Hibernate的规范表。它拥有属性id。firstName和lastName学生表中的列名相应。接下来让咱们建立StudentDAO.java文件例如如下:
package com.yiibai.hibernate; import java.util.ArrayList; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import com.googlecode.s2hibernate.struts2.plugin.\ annotations.SessionTarget; import com.googlecode.s2hibernate.struts2.plugin.\ annotations.TransactionTarget; public class StudentDAO { @SessionTarget Session session; @TransactionTarget Transaction transaction; @SuppressWarnings("unchecked") public List<Student> getStudents() { List<Student> students = new ArrayList<Student>(); try { students = session.createQuery("from Student").list(); } catch(Exception e) { e.printStackTrace(); } return students; } public void addStudent(Student student) { session.save(student); } }
StudentDAO类。学生类是数据訪问层。它有一些方法来列出所有学生,而后保存一个新的学生记录。
下面文件AddStudentAction.java定义咱们的动做类。咱们这里有两个动做方法 - execute() 和 listStudents()。
execute()方法是用来加入新的学生记录。
使用DAO的save()方法来实现这一目标。还有一种方法。listStudents()用来列出学生。
咱们使用DAO的的列表方法获得所有学生的名单。
package com.yiibai.struts2; import java.util.ArrayList; import java.util.List; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.yiibai.hibernate.Student; import com.yiibai.hibernate.StudentDAO; public class AddStudentAction extends ActionSupport implements ModelDriven<Student>{ Student student = new Student(); List<Student> students = new ArrayList<Student>(); StudentDAO dao = new StudentDAO(); @Override public Student getModel() { return student; } public String execute() { dao.addStudent(student); return "success"; } public String listStudents() { students = dao.getStudents(); return "success"; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } }
实现ModelDriven接口你会注意到,这是用来当你的操做类处理一个详细的模型类(如学生),而不是我的属性(如名字,姓氏)。
的ModelAware接口需要实现的方法。以返回到模型。
在咱们的样例中,咱们返回“学生”对象。
现在让咱们建立student.jsp视图文件包括下面内容:
<%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>Hello World</title> <s:head /> </head> <body> <s:form action="addStudent"> <s:textfield name="firstName" label="First Name"/> <s:textfield name="lastName" label="Last Name"/> <s:textfield name="marks" label="Marks"/> <s:submit/> <hr/> <table> <tr> <td>First Name</td> <td>Last Name</td> <td>Marks</td> </tr> <s:iterator value="students"> <tr> <td><s:property value="firstName"/></td> <td><s:property value="lastName"/></td> <td><s:property value="marks"/></td> </tr> </s:iterator> </table> </s:form> </body> </html>
很easystudent.jsp。在上面的部分,咱们有一个形式提交到“addStudent.action”。这需要在名字,姓氏和备注。因为addStudent 动做,本身主动绑到ModelAware的“AddSudentAction”,将建立一个学生bean的名字,姓氏和标记本身主动填充的值。
在底部,咱们去经过的学生名单(见AddStudentAction.java)。咱们遍历列表和显示的值在表中的姓氏,名称和备注。
让咱们把它放在一块儿使用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> <constant name="struts.devMode" value="true" /> <package name="myhibernate" extends="hibernate-default"> <action name="addStudent" method="execute" class="com.yiibai.struts2.AddStudentAction"> <result name="success" type="redirect"> listStudents </result> </action> <action name="listStudents" method="listStudents" class="com.yiibai.struts2.AddStudentAction"> <result name="success">/students.jsp</result> </action> </package> </struts>
这里要注意的最重要的事情是,咱们包函“myhibernate”扩展Struts2默认包称为“hibernate-default”。而后咱们声明两个动做 - addStudent和listStudents。
addStudent调用execute()上AddStudentAction类,而后,它调用listStudents操做方法successs。
listStudent动做方法调用listStudents()上AddStudentAction类做为视图,并使用student.jsp
现在右击项目名称。并单击Export > WAR 文件建立一个WAR文件。而后部署这个WAR在Tomcat的webapps文件夹下。
最后,启动Tomcatserver和尝试訪问URL http://localhost:8080/HelloWorldStruts2/student.jsp。这会给你下面画面:
在上面的部分,咱们获得的一种形式,进入一个新的学生记录和底部列出了学生在数据库中的值。继续并加入一个新的学生记录。按提交。屏幕将刷新并显示您的更新列表。