struts2+ibatis
Struts2学习之二--Struts2标签介绍

Struts2学习之二--Struts2标签介绍热12已有 14625 次阅读 2009-07-12 18:53[顶]3G移动--Android开发工程师全能班(转) Struts2学习之二--Struts2标签介绍在上一篇文章《为Struts 2.0做好准备》中,我过于详细地介绍了Struts 2.0开发环境和运行环境的配置,所以,本文很少涉及的以上两方面的细节。
如果,您看完《为Struts 2.0做好准备》后,还有什么不明白,或者没法运行文中例子,请联系我。
我的E-MAIL:Max.M.Yuan@。
在介绍常用标志前,我想先从总体上,对Struts 1.x与Struts 2.0的标志库(Tag Library)作比较。
分类将标志库按功能分成HTML、Tiles、Logic和Bean等几部分严格上来说,没有分类,所有标志都在URI为“/struts-tags”命名空间下,不过,我们可以从功能上将其分为两大类:非UI标志和UI标志表达式语言(expression languages)不支持嵌入语言(EL)OGNL、JSTL、Groovy和Velcity以上表格,纯属个人总结,如有所不足或错误,请不吝指正好了,我要开始介绍“常用”(这里所谓的“常用”,是指在已往工作中使用Struts里经常用到的)的标志了。
1.非UI标志o if、elseif和else描述:执行基本的条件流转。
参数:名称必需默认类型描述备注test 是Boolean 决定标志里内容是否显示的表达式else标志没有这个参数id 否Object/String 用来标识元素的id。
在UI和表单中为HTML的id属性例子:<%@ page contentType="text/html; charset=UTF-8" %><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Condition Flow</title></head><body><h3>Condition Flow</h3><!--这里有点小技巧:本来可以用#[0]来获得,请求中name的值。
struts2

—高级软件人才实作培训专家! 高级软件人才实作培训专家!
搭建Struts2开发环境
搭建Struts2环境时,我们一般需要做以下几个步骤的工作: 1》找到开发Struts2应用需要使用到的jar文件. 2》编写Struts2的配置文件 3》在web.xml中加入Struts2 MVC框架启动配置
北京传智播客教育
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
搭建Struts2开发环境--Struts2在web中的启动配置
在struts1.x中, struts框架是通过Servlet启动的.在struts2中, struts框架是通过Filter启动的.他在web.xml中的配置如下:
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
Struts2
讲师: 讲师:黎活明
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
Struts2
Struts2是在WebWork2基础发展而来的.和struts1一样, Struts2也属于MVC框架. 不过有一点大家需要注意的是:尽管Struts2和struts1在名字上的差别不是很大,但 Struts2和struts1在代码编写风格上几乎是不一样的.那么既然有了struts1,为何还要 推出struts2.主要是因为struts2有以下优点:
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
第一个Struts2应用--HelloWorld
在默认的配置文件struts.xml 中加入如下配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.0.dtd"> <struts> <package name="itcast" namespace="/test" extends="struts-default"> <action name="helloworld" class="cn.itcast.action.HelloWorldAction" method="execute" > <result name="success">/WEB-INF/page/hello.jsp</result> </action> </package> </struts>
各种系统架构图及其简介范文

1.Spring 架构图Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。
框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE 应用程序开发提供集成的框架。
Spring 框架的功能可以用在任何J2EE 服务器中,大多数功能也适用于不受管理的环境。
Spring 的核心要点是:支持不绑定到特定J2EE 服务的可重用业务和数据访问对象。
这样的对象可以在不同J2EE 环境(Web或EJB )、独立应用程序、测试环境之间重用。
组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
每个模块的功能如下:∙核心容器:核心容器提供Spring 框架的基本功能。
核心容器的主要组件是BeanFactory ,它是工厂模式的实现。
BeanFactory 使用控制反转(IOC )模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
∙Spring 上下文:Spring 上下文是一个配置文件,向Spring 框架提供上下文信息。
Spring 上下文包括企业服务,例如JNDI 、EJB 、电子邮件、国际化、校验和调度功能。
∙Spring AOP :通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring 框架中。
所以,可以很容易地使Spring 框架管理的任何对象支持AOP 。
Spring AOP 模块为基于Spring 的应用程序中的对象提供了事务管理服务。
通过使用Spring AOP ,不用依赖EJB 组件,就可以将声明性事务管理集成到应用程序中。
∙Spring DAO :JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。
异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。
Spring DAO 的面向JDBC 的异常遵从通用的DAO 异常层次结构。
ssi学习手记

Spring2.5、Struts2、Ibatis开发框架搭建(一)ssi, ibatis网站:http://114.80.201.3/tag.php?name=ssiCsdn网站:/一、框架下载1.1 Struts2框架Struts2框架发展于WebWork,现在捐献给了Apache开源组织,最新版本的Struts2框架可以从位于Apache官方网站的Struts2项目中获取,Struts2框架的项目主页地址为:/,下载页面地址为: /download.cgi,打开下载地址以后自己选择最新发布的版本即可,新手的话下载Full Distribution的版本,例如/download.cgi#struts2014中的struts-2.0.14-full.zip。
为了让struts2能够支持json格式的返回数据,还需要下载json插件,下载地址为/p/jsonplugin/,下载文件为jsonplugin-0.31.jar 文件。
1.2 Spring2.5 框架Spring框架的官方网站地址:/,下载页面为:/download,打开下载页面以后选择Get the latest Spring releases here中的发行包去下载使用,注意Spring官方网站中包含的框架有很多,包括流程处理、安全、Web服务等很多种框架,我们需要下载的框架是Spring FrameWork 的某个版本,不是其它的那些框架。
1.3 Ibatis框架iBATIS框架的主页是/,在打开的网站界面中选择选择左边的Get software中的for java连接,在打开的界面中选择下载连接。
1.4 其它(数据库缓冲池框架等)如果需要使用Ms Sql Server数据库的话,还需要在项目中加入jtds 的JDBC驱动程序,下载地址/,找到download连接,按提示信息下载即可。
下载DBCP数据库缓冲池框架,下载地址为/dbcp/,下载最新版本即可,因为DBCP框架是apache开源软件组织的众多框架中的一部分,要让DBCP工作的话,还需要common-pool框架,自行到apache官方网站下载二、向项目中加入Spring Struts iBATIS框架2.1 准备工作将下载的三个框架分别解压缩。
Struts2知识点总结

Struts2基础知识Struts2概述1.Struts2框架应用javaee三层结构中的web层框架。
2.Struts2框架在struts1和webwork基础之上发展的全新框架。
3.Struts2所解决的问题:在以往实现一个功能时,都需要写很多的servlet,从而造成后期维护上的不方便。
图解:4.现在比较稳定的Struts2版本struts-2.3.24-all.zip5.web层常见框架1.struts2.springMVCStruts2框架入门1.导入jar包1.在lib里面有jar包,但不能全部导入,因为里面含有一些spring包,是不能使用的,导入会导致程序不能运行。
2.到app目录里面复制案例的jar包是最好的方法。
2.创建action3.配置action类的访问路径1.创建struts2核心配置文件,该核心配置文件位置和名称是固定的,位置必须在src下面,名称为struts.xml 。
2.引入dtd约束,可以在案例文件中找到,复制在struts.xml文件中即可。
3.action的配置*注意访问路径:http://域名/端口号/项目名/action名.action注意:.action可以省略,但建议不要省略,为了兼容一些老版本的浏览器。
4.配置Struts2的过滤器,可以在案例中的web.xml文件中找到,复制粘贴即可。
Struts2执行过程图解:Struts2配置1.是一种常量标签2.修改Struts2的默认常量值1.常用方式在struts.xml中进行配置。
2.其它两种方式1.在src下面创建struts.properties文件并修改。
2.在web.xml文件中进行修改。
3.Struts2最常用的常量struts.il8n.encoding=UTF-8,解决表单在通过post方式提交中文时,中文乱码的问题。
Struts2笔记(一)可使用全局页面。
1、配置方法:在package标签下配置2、注意:该标签只能在一个package标签中使用,如果有多个标签,需要重新定义。
基于Struts2和iBATIS的JSP开发框架设计与实现

基于Struts2和iBATIS的JSP开发框架设计与实现摘要:在jsp应用程序存在异常处理分散、拼接sql语句繁琐易错、上下层次模块间耦合度高等问题,这些问题使系统难以扩展和维护。
本文设计并实现了一个基于struts2和ibatis的jsp开发框架,解决上述问题。
该框架已经实现并在实际开发中使用。
通过对比证明,该框架提高了jsp应用系统的灵活性和扩展性,同时也缩短了开发周期,降低了开发成本。
关键词:struts2;ibatis;jsp开发框架中图分类号:tp311.52jsp(java server pages)是常见的b/s架构(browser/server 架构)[1]实现技术之一。
在笔者为学校开发“奖助贷系统”和“认证考试报名系统”等jsp应用系统的过程中,遇到了以下问题:(1)为系统所有模块增加、修改或者移除一个功能时,需要改动大量代码,异常处理分散,当异常处理方式改变时,代码修改量也很大;(2)系统中需要大量动态拼接sql语句,在java中拼接sql语句非常繁琐,而且容易出错;(3)业务逻辑处理和数据存取之间的接口耦合度高,多个开发人员之间沟通成本也很高。
笔者通过对已开发的两个项目进行研究,设计了一个简单的jsp 开发框架,来解决上述三个问题。
1 关键技术简介1.1 mvc和struts2框架mvc框架模式全称是model-view-controller[2]。
其中,model表示业务逻辑和数据存取,view表示数据显示,controller连接model和view两部分。
mvc把数据显示(v)和数据(m)隔离,同时也把两者之间的联系(c)独立出来,三个部分各司其职,互不干扰。
struts2框架[3]对应于controller部分。
它通过编写xml配置文件,控制页面跳转。
struts2的配置代码示例如下:method=“query”>/list_s.jsp/list_t.jspstruts2的拦截器机制还能对所有请求做相同的处理[4]。
Struts2的配置文件详解

1.3.包含配置:
在Struts2中可以将一个配置文件分解成多个配置文件,那么我们必须在struts.xml中包含其他配置文件。
<struts>
<includefile="struts-default.xml"/>
<includefile="struts-user.xml"/>
erName= userName;
}
/**
*@returnthepassword
*/
publicString getPassword() {
returnpassword;
}
/**
*@parampasswordthepasswordtoset
*/
publicvoidsetPassword(String password) {
</action>
</package>
</struts>
如上示例的配置,配置了一个名为default的包,该包下定义了一个Action。
1.2.命名空间配置:
考虑到同一个Web应用中需要同名的Action,Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action。
Struts2通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。
l public Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例。
l public void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。
01、struts2(Struts2开发入门 、常用配置、参数传递) - 副本

1. Struts2简介1.1. 什么是Struts21.1.1. Struts2的概念Struts2是轻量级的MVC框架,它主要解决了请求分发的问题,重心在于控制层和表现层。
轻量级,指的是Struts2具有较低的侵入性,就是它对我们业务代码的依赖程度很低,简单来说,在使用Struts2框架时,我们的业务代码中基本上不需要import它的包。
Struts2实现了MVC,满足了MVC设计思想。
在我们使用Struts2做开发的时候,就相当于使用了MVC,这是Struts2自动帮助我们实现的,是默认的、隐含的,我们不需要再写特别的代码来实现MVC了。
作为一个框架,Struts2提供了一系列的API,我们可以使用它们来简化代码的编写,从而提升开发效率。
这些API复用程度很高,对业务代码的依赖性也很小,甚至很多是Struts2自动调用的,因此在很大程度上,我们的开发变得可以复用。
Struts2解决请求分发的问题,我们会在后面为什么使用Struts2中讲解。
重心在控制层和表现层,是纵观整个Struts2理论课程来看的,从中我们会体会到这一点,随着大家对Struts2的逐步了解,届时我们再回顾这一点。
1.1.2. 什么是MVCMVC是代码的分层思想,是软件设计领域经典的设计模式。
它根据代码功能的不同,将一个软件的代码分为3部分,即模型、视图、控制器,这3部分代码的含义和功能如下。
1、M-Model 模型模型(Model)的职责是负责业务逻辑。
包含两层:业务数据和业务处理逻辑。
比如实体类、DAO、Service都属于模型层。
2、V-View 视图视图(View)的职责是负责显示界面和用户交互(收集用户信息)。
属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
3、C-Controller 控制器控制器是模型层M和视图层V之间的桥梁,用于控制流程。
比如:在Servlet项目中的单一控制器ActionServlet。
struts2+ibatis+spring整合开发

Struts2+ibatis+spring整合开发1.工程结构图2.配置文件web.xml<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4"xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value> </context-param><listener><listener-class>org.springframework.web.context.ContextLoaderList ener</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>如图:Struts.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><constant name="struts.objectFactory.spring.autoWire" value="type" /><constant name="struts.objectFactory" value="spring" /><include file="struts-default.xml"/><package name="struts2" extends="struts-default"><default-interceptor-ref name="paramsPrepareParamsStack" /> <!-- aciton的class为applicationContext.xml中的注册名 --><action name="login" class="LoginAction"><result name="success">/success.jsp</result><result name="input">/login.jsp</result></action><action name="save" class="LoginAction" method="save"><result name="success"type="redirect-action">show.action</result><result name="error">/error.jsp</result></action><action name="edit" class="LoginAction" method="edit"><result name="success">update.jsp</result></action><action name="update" class="LoginAction" method="update"> <result name="success"type="redirect-action">show.action</result><result name="error">/error.jsp</result></action><action name="delete" class="LoginAction" method="delete"> <result name="success"type="redirect-action">show.action</result><result name="error">/error.jsp</result></action><action name="show" class="LoginAction" method="findAllUser"> <result name="success">/list.jsp</result><result name="error">/error.jsp</result></action></package></struts>如图:Struts.properties#struts.url.http.port=8080struts.devMode=truestruts.configuration.xml.reload=truestruts.locale=zh_CNstruts.i18n.encoding=UTF-8struts.objectFactory=spring如图:sql-map-config.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE sqlMapConfigPUBLIC "-////DTD SQL Map Config 2.0//EN""/dtd/sql-map-config-2.dtd"><sqlMapConfig><sqlMap resource="cn/hsw/model/user.xml"/></sqlMapConfig>如图:applicationContext.xml<?xml version="1.0" encoding="UTF-8"?><beans default-autowire="byType"xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.0.xsd"> <bean id="dataSource"class="mons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://127.0.0.1:3306/debug" /><property name="username" value="root" /><property name="password" value="123456" /></bean><bean id="client"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="dataSource"><ref local="dataSource"/></property><property name="configLocation"><value>classpath:sql-map-config.xml</value></property></bean><!-- bean中的class为实现接口的类;property的name为类中引用的属性名称;ref 为spring注册的名称,如上面的client--><bean id="userDao"class="erDAO"><property name="client" ref="client" /></bean><bean id="userService"class="erService"><property name="userDAO" ref="userDao"></property> </bean><bean id="LoginAction" class="cn.hsw.action.Login"><property name="userService" ref="userService"></property> </bean></beans>如图:3.Login.javapackage cn.hsw.action;import java.util.List;import er;import cn.hsw.service.IUserService;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import com.opensymphony.xwork2.Preparable;public class Login extends ActionSupport implements ModelDriven<User>,Preparable {private IUserService userService=null;private String id;private int pageIndex=1;private String pageBar;private List<User> list;private User user;public void prepare()throws Exception{if(id==null||id.length()==0){user=new User();}else{user=getUserService().getUserById(Integer.parseInt(id));}}public String execute()throws Exception{if(getUserService().isLogin(user)){return SUCCESS;}return INPUT;}public String save()throws Exception{if(getUserService().insertUser(user)){return SUCCESS;}return ERROR;}public String edit(){return SUCCESS;}public String update()throws Exception{if(getUserService().updateUser(user)){return SUCCESS;}return ERROR;}public String delete()throws Exception{if(getUserService().deleteUser(Integer.parseInt(id))){return SUCCESS;}return ERROR;}public String findAllUser()throws Exception{try {list=getUserService().getAllUser();} catch (Exception e) {}return SUCCESS;}public String getId() {return id;}public void setId(String id) {this.id = id;}public int getPageIndex() {return pageIndex;}public void setPageIndex(int pageIndex) { this.pageIndex = pageIndex;}public String getPageBar() {return pageBar;}public void setPageBar(String pageBar) { this.pageBar = pageBar;}public List<User> getList() {return list;}public void setList(List<User> list) {this.list = list;}public User getUser() {return user;}public void setUser(User user) {er = user;}public void setUserService(IUserService userService) { erService = userService;}public IUserService getUserService() {return userService;}public User getModel() {// TODO Auto-generated method stubreturn user;}}如图:IUserDAO.javapackage cn.hsw.dao;import java.util.List;import er; public interface IUserDAO {public List<User> getAllUser();public User getUserById(Integer id);public boolean isLogin(User user);public boolean insertUser(User user);public boolean updateUser(User user);public boolean deleteUser(Integer id);}如图:UserDAO.javapackage cn.hsw.dao;import java.util.List;import org.springframework.orm.ibatis.SqlMapClientTemplate;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; import er;import com.ibatis.sqlmap.client.SqlMapClient;public class UserDAO implements IUserDAO {private SqlMapClient client = null;public boolean deleteUser(Integer id) {try {client.delete("deleteUser", id);return true;} catch (Exception e) {return false;}}public List<User> getAllUser() {List<User> list=null;try{list=client.queryForList("getAllUser");}catch(Exception e){e.getStackTrace();}return list;}public User getUserById(Integer id) {User user=null;try {user=(User) client.queryForObject("getUserById",id);return user;} catch (Exception e) {e.getStackTrace();}return user;}public boolean insertUser(User user) {try{client.insert("insertUser",user);return true;}catch(Exception e){return false;}}public boolean isLogin(User user) {try {User u=(User) client.queryForObject("checkUser",user);if(u!=null){return true;}} catch (Exception e) {e.getStackTrace();}return false;}public boolean updateUser(User user) {try {client.update("updateUser",user);return true;} catch (Exception e) {return false;}}public void setClient(SqlMapClient client) { this.client = client;}}如图:User.javapackage cn.hsw.model;public class User {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) { ername = username;}public String getPassword() {return password;}public void setPassword(String password) { this.password = password;}}如图:user.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE sqlMapPUBLIC "-////DTD SQL Map 2.0//EN""/dtd/sql-map-2.dtd"><sqlMap namespace="User"><typeAlias alias="user" type="er"/><!-- 查询表中记录条数 --><select id="recordCount" resultClass="int"><![CDATA[select count(*) from user]]></select><select id="getUserById" parameterClass="int" resultClass="user"> <![CDATA[select * from user where id =#id#]]></select><select id="getAllUser" resultClass="user"><![CDATA[select * from user]]></select><select id="checkUser" parameterClass="user" resultClass="user"> <![CDATA[select * from user where username =#username# and password =#password#]]></select><!-- --><select id="firstPage" resultClass="user" parameterClass="user"> <![CDATA[select top $pagesize$ * from user order by id desc ]]></select><delete id="deleteUser" parameterClass="int"><![CDATA[delete from user where id= #id#]]></delete><update id="updateUser" parameterClass="user"><![CDATA[update user set username= #username#,password= #password# where id =#id#]]></update><insert id="insertUser" parameterClass="user"><![CDATA[insert into user(username,password)values(#username#,#password#)]]></insert></sqlMap>如图:IUserService.javapackage cn.hsw.service;import java.util.List;import er;public interface IUserService {public List<User> getAllUser();public User getUserById(Integer id);public boolean isLogin(User user);public boolean insertUser(User user);public boolean updateUser(User user);public boolean deleteUser(Integer id); }如图:UserService.javapackage cn.hsw.service;import java.util.List;import cn.hsw.dao.IUserDAO;import erDAO;import er;public class UserService implements IUserService { private IUserDAO userDAO=null;public void setUserDAO(UserDAO userDAO) { erDAO = userDAO;}public boolean deleteUser(Integer id) {return userDAO.deleteUser(id);}public List<User> getAllUser() {return userDAO.getAllUser();}public User getUserById(Integer id) {return userDAO.getUserById(id);}public boolean insertUser(User user) { return userDAO.insertUser(user); }public boolean isLogin(User user) { return userDAO.isLogin(user); }public boolean updateUser(User user) { return userDAO.updateUser(user); }}如图:4.页面adduser.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags" %><html><head><title>My JSP 'adduser.jsp' starting page</title></head><body><s:form action="save" method="post"><s:textfield label="username" name="username"/><s:password label="password" name="password"/><s:submit value="save"/></s:form></body></html>如图:error.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags" %><html><head><title>My JSP 'error.jsp' starting page</title></head><body>This is my JSP page. <br></body></html>如图:list.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags" %><html><head><title>My JSP 'list.jsp' starting page</title></head><body><s:form action="show" method="post"><table width="50%" align="center"><tr><td align="center">userid</td><td align="center">username</td><td align="center">password</td></tr><s:iterator value="list" id="user" status="st"><tr><td align="center"><s:property value="id"/></td><td align="center"><s:property value="username"/></td><td align="center"><s:property value="password"/></td><td align="center"><s:url id="update" action="edit"><s:param name="id"><s:property value="id"/></s:param></s:url><s:a href="%{update}">update</s:a></td><td align="center"><s:url id="delete" action="delete"><s:param name="id"><s:property value="id" /></s:param></s:url><s:a href="%{delete}">delete</s:a></td></tr></s:iterator><tr><td colspan="4"><s:property value="#request.pageBar" escape="false"/> </td></tr></table></s:form> </body></html>如图:login.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags" %><html><head><title>My JSP 'login.jsp' starting page</title></head><body><s:form action="login" method="post"><s:textfield label="username" name="username"/><s:password label="password" name="password"/><s:submit value="submit"/></s:form></body></html>如图:success.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags" %><html><head><title>success</title></head><body><a href="show.action">显示用户列表</a></br><a href="adduser.jsp">添加用户</a></body></html>如图:update.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags" %><html><head><title>update.jsp</title></head><body><s:form action="update" method="post"><s:textfield name="id" label="ID" value="%{id}" readonly="true"/> <s:textfield name="username" label="UserName" value="%{username}" required="true"/><s:textfield name="password" label="Password" value="%{password}" required="true"/><s:submit value="update"/></s:form></body></html>如图:5.jar包6.表userCREATE TABLE `user` (`id` int(11) NOT NULL auto_increment,`username` varchar(20) NOT NULL default '',`password` varchar(11) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=gbk。
第一章Struts2系统架构

第一章Struts2系统架构本章主要介绍的Struts2的系统架构,让学员对Struts2框架在结构上有一个整体概念为我们以后更加详细的学习Struts2打下一个良好的基础。
第一节Struts2的系统架构及处理的主要流程1.Struts1简介Struts1的历史比较久远,Struts1是世界上第一个发布的MVC框架,目前市场率最高的框架。
下面将简单讲解Struts1的基本架构。
图1-1显示了Struts1的数据流图。
图1-1 Struts1数据流图Struts1框架以ActionServlet为核心控制器,ActionServlet获得客户端请求。
然后ActionServlet根据请求信息调用匹配的业务逻辑控制器(Action)处理用户请求。
请求处理完成后,业务逻辑处理器调用相应的JSP显示处理结果。
Struts1框架实现了MVC模式,下面我们了解一下Struts1是怎样实现MVC模式的。
Struts1框架中并没有提供Model层的实现。
在实际的企业应用中,通过一个JavaBean 实现一个业务逻辑,在功能比较复杂的应用中也采用EJB或WebService服务实现业务逻辑。
Struts1框架的View层采用JSP实现。
Struts1提供了大量丰富的标签库。
这些标签库与Struts的组件兼容的特别好,可以很容易的输出控制器的处理结果。
Struts1框架中,控制器是它的核心,Struts1的控制器由两部分组成:核心控制器(ActionServlet)和业务逻辑控制器(Action),核心控制器由Struts1框架提供。
业务逻辑控制器需要由用户自己继承Struts1框架提供的Action类实现。
在Struts1框架中,JSP/Servlet耦合非常紧密。
这种紧密关系促使Struts1存在各种缺陷。
下面我们分析一下Struts1中存在的缺陷。
●支持的表现层技术单一●耦合性强,不便于单元测试●代码依赖于Struts1 API,侵入性强2.WebWork简介WebWork出自于开源组织opensymphony,实际的创始人是Java领域的名人Rickard Oberg(JBoss和XDoclet的作者)。
Velocity 和 Struts2

3.与WEB容器无关,除了HTML,也可以生成各种文本,如XML、RTF、Java源代码等。
FreeMarker缺点:
1.freemarker的map限定key必须是string,不支持其他数据类型。(对我的应用好象影响不大)
在Struts2中查找vm文件的顺序先查找Web应用程序,再查找类路径。如果你需要使用vm作为显示层,只需要在配置文件中指定result的type属性为velocity,然后将<param>的location属性指定到一个以vm结尾的资源上就可以了!
1.Struts2中的Velocity中文乱码的处理方式:
2.freemarker的变量必须有值,没有被赋值的变量就会抛出异常。程序里面几乎所有可能出现空值的变量统统需要加上${xxx?if_exists},有些循环条件还需要写if判断。
3.不能在群集上面发布应用。freemarker支持在页面里面直接操作Session,request等,例如${Session[...]},但不能对其序列化。(这个对我也不是问题,作为企业里的小应用,我就不用群集)
因为在Velocity-1.4.jar中的org.apache.velocity.runtime.defaults中定义的velocity.properties中定义的input.encoding=ISO8859-1,output.encoding=ISO8859-1,通常最好在VM文件中使用%{getText(‘’)}调用国际化资源文件的内容就不会产生乱码。
struts2 与 velocity 的整合最难的地方也就是这个地方了,完成了上面的两件事情,我们就可以像使用jsp一样,在struts中使用velocity 了,而且能够得到velocity的所有好处. 写VelocityLayoutResult这个类的人确实是强人.
Struts2介绍

Struts2集成指南关于Struts2Struts是Apache软件基金会(ASF)赞助的一个开源项目。
它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。
它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔Web Framework〕,是MVC经典设计模式中的一个经典产品。
Struts,a history在Java EE的Web应用发展的初期,除了使用Servlet技术以外,普遍是在JavaServer Pages(JSP)的源代码中,采用HTML与Java代码混合的方式进行开发。
因为这两种方式不可避免的要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。
为了摆脱上述的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000年,Craig McClanahan采用了MVC的设计模式开发Struts。
后来该框架产品一度被认为是最广泛、最流行JAVA的WEB应用框架。
Craig McClanahan2006年,WebWork与Struts这两个优秀的Java EE Web框架(Web Framework〕的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,原Struts的1.x版本产品称为“Struts 1”。
至此,Struts项目并行提供与维护两个主要版本的框架产品——Struts 1与Struts 2。
Struts1 vs. Struts2侵入性Struts 1在编程方面是面向抽象类编程,而不是面向接口编程。
Struts 1要求自定义Action 类继承一个特定的抽象基类Action。
另一方面,Struts 1的 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。
Struts2课件

Sturuts2第一节、Struts2介绍Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
Struts2对Struts1进行了巨大的改进。
主要表现在如下几个方面: 在Action的实现方面:Struts1要求必须统一扩展自Action类,而Struts2中可以是一个POJO。
线程模型方面:Struts1的Action是单实例的,一个Action的实例处理所有的请求。
Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
Servlet依赖方面:Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。
这使程序难于测试。
Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
封装请求参数:Struts1中强制使用ActionForm对象封装请求的参数。
Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
表达式语言方面:Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph NavigationLanguage)。
绑定值到视图技术:Struts1使用标准的JSP,Struts2使用"ValueStack"技术。
六大类系统架构图及其简介

各种系统架构图及其简介1.Spring架构图Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。
框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。
Spring框架的功能可以用在任何J2EE 服务器中,大多数功能也适用于不受管理的环境。
Spring的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。
这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。
组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
每个模块的功能如下:核心容器:核心容器提供Spring框架的基本功能。
核心容器的主要组件是BeanFactory,它是工厂模式的实现。
BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。
Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP模块直接将面向方面的编程功能集成到了Spring框架中。
所以,可以很容易地使Spring框架管理的任何对象支持AOP。
Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。
通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。
异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。
Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。
Spring ORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。
ibatis struts2 spring 介绍

系统架构
设计的原则和评判标准
系统的内聚和耦合度 层次的清晰和简洁性 易于实现性 规范性 可维护性(业务的修改、架构的更换) 可升级和可扩充性 可移植性 可复用性 利于团队合作开发
可靠性、 强壮性、灵活性 高效、 安全
系统的分层结构
我们在解决一个复杂的问题的时候,通常使用 的一个技巧就是分解,把复杂的问题分解成为 若干个简单的问题,逐步地、分别地解决这几 个小问题,最后就把整个问题解决掉。 设计一个复杂的软件系统的时候,同样的,为 了简化问题,我们也通常使用的一个技术就是 分层,每个层完成自身的功能,最后,所有的 层整合起来构成一个完整的系统(“分而治之” 的思想)。
MVC发展历程
后来出现了jsp的页面标签和ajax,可以异步的 请求服务器端资源,将M与VC分开,但是系统 仍然不够灵活。 终于出现了MVC,系统三部分完全解耦分离, 灵活度大大提高,可以采用flex等作为V了。
MVC 的问题 JSP (view) +SERVLET (controller)
Singleton:单例对象的管理
Dependency Inject (DI)
建立/初始化 Object with DI 业务逻辑
Object
业务逻辑
AOP简介
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分 离应用的业务逻辑与系统级服务(例如审计(auditing)和事务 (transaction)管理)进行内聚性的开发。应用对象只实现它 们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚 至是意识)其它的系统级关注点,例如日志或事务支持。
JSP 与 SERVLET 一一对应 大量的 SERVLET SERVLET 的代码相似度很高
Struts2知识点总结

1.struts2 步骤1.创建web项目2.添加struts2的必须jar包3.添加支持(配置web.xml文件)4.创建界面和相应的action5.配置struts.xml文件6.部署运行项目2.struts2的工作流程1. 浏览器发送一个请求。
2. 核心控制器FilterDispatcher根据请求决定调用合适的Action。
3. 拦截器(Intercepter)自动对请求应用通用功能,如验证等。
4. 回调Action的execute方法,该execute方法根据请求的参数来执行一定的操作。
5. Action的execute方法处理结果信息将被输出到浏览器中,支持多种形式的视图。
3.struts2的配置文件1.web.xml2.struts.xml(核心管理Action映射) 自己配置的3.struts-default.xml是struts2框架默认加载的配置文件。
它定义struts2一些核心的bean和拦截器。
这些拦截器是以key-value对的形式配置在struts-default.xml中,其中name是拦截器名字,就是后面使用该拦截器的引用点,value则指定拦截器的实现类。
4.struts.properties(核心管理属性) 自己配置的5.default.properties(核心管理属性)4.<struts>标签下的子标签配置1.<bean type="com.opensymphony.xwork2.ObjectFactory" name="struts"class="org.apache.struts2.impl.StrutsObjectFactory" />2.<include file="struts1.xml"></include>3.<constant name=“key” value=“value” />4.<package></package>5.package标签下的配置1.<action name="loginAction" class="com.action.loginAction"><result name="success">/welcome.jsp</result><result name="error">/index.jsp</result></action>2.<global-results><result></result></global-results>3.<global-exception-mappings><exception-mapping result="error"exception="java.long.Exception"></exception-mapping></global-exception-mappings>……………………………………6.action类实现Action接口和继承ActionSupport7.通过ActionContext类获得context(request),再通过context获得session和application context.put("key","value");session.put("key","value");session.put("key","value");public class ServletActionContext (org.apache.struts2)public static PageContext getPageContext()public static HttpServletRequest getRequest()public static HttpServletResponse getResponse()public static ServletContext getServletContext()8.在action中直接使用一个对象,两种方式:1.在提交表单时name属性为:对象.xxxx2.实现ModelDriven<类类型>接口和其方法。
struts2

一、Struts2入门1.概念什么是Struts2Struts2 是一个用来开发 MVC 应用程序的框架.它提供了 Web 应用程序开发过程中的一些常见问题的解决方案:对页面导航活动进行管理对来自用户的输入数据进行合法性验证统一的布局可扩展性国际化和本地化支持 Ajax表单的重复提交Struts2 VS Struts1Struts2与Struts1 相比,在体系结构方面更优秀,具体表现在类更少,更高效,扩展更容易等。
struts2 不是从 Struts1 扩展而来的, 说它是一个换了品牌标签的 WebWork 更合适。
2.程序Struts2 核心就是一个 Filter,该Filter会对所有的请求进行拦截(/*) StrutsPrepareAndExecuteFilterStrutsPrepareFilter + StrutsExecuteFilterStruts2 将所有的请求拦截下来,具体去访问哪个java类的方法需要读取配置文件 struts.xmlstruts.xml 文件需位于工程的类路径下实现一个 Struts 的 HelloWorld 程序1) 将 %struts2-blank例子%\WEB-INF\lib 目录下所有jar包拷贝至 webproject\WEB-INF\lib 中拷贝至webproject/WEB-INF/web.xml 中3) %struts2-blank例子%\将WEB-INF\classes 下的struts.xml 文件拷贝至工程src下清空 <struts></ struts> 标签之间的内容4) 新建 Action 实例, HelloWorldAction.javaAction可以不必是实现任何接口,它是一个普通java类(pojo),从这点可以看出 Struts2 是非侵入式设计,Action可以不依赖struts和Servlet 而独立存在Action中至少需要定义一个方法,且方法的返回值类型必须为Stringpublic String sayHello() {return "success";}6) 在 WEB-INF 下新建jsp页面hello.jsphello动手练习:用 struts2 实现最简单的mvc二、Struts2 细节1.package 元素配置action的组织包name:配置包名,用于被继承namespace: 配置访问路径以 /a/b/c/action 为例搜索action的顺序为 /a/b/c -- /a/b -- /a -- /extends: 指定继承的包2. action 元素1) name属性配置action的访问名称后缀默认为 action和””可以通过常量进行配置<constant name="struts.action.extension" value="do"></constant>2) class属性配置action对应的java类,必须为完整类名如果继承struts-default 包,默认class 为ActionSupport,该类的 execute方法默认返回 success我们在写 Action 类时通常会选择继承ActionSupport,也就自动继承了 execute 方法,同时可以使用父类定义的常量 SUCCESS、ERROR 等3) method属性配置action的访问方法名,默认访问execute方法4) 通配符映射一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系通配符的映射规则●若找到多个匹配, 没有通配符的那个将胜出●若指定的Action不存在, Struts 将会尝试把这个URI与任何一个包含着通配符 * 的Action名及进行匹配●若 Struts 找到的带有通配符的匹配不止一个, 最后一个匹配将胜出●被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…{0} 匹配整个 URI●* 可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 \.例:<action name="*_add" class="cn.itcast.action.Girl" method="add"></action>匹配路径 Boy_add.action Girl_add.action<action name="Boy_*_*" class="cn.itcast.action.Boy" method="{1}"><result name="success"><param name="location">/WEB-INF/jsp/{2}.jsp</param></result></action>Boy_add_delete 会调用 Boy的add方法,转发给 delete.jsp5) 动态方法调用通过 url 动态调用 Action 中的方法<action name="Boy" class="cn.itcast.action.Boy">/strutsdemo/Boy!add.action 会调用Boy类的add方法默认情况下, Struts 的动态方法调用处于激活状态, 若想禁用该功能, 则可以在 struts.xml 文件中配置常量3. Action 类概念:action: 应用程序可以完成的每一个操作(用户的一个动作) 例如:显示一个登陆表单,保存商品信息Action类:Struts2中的Action是pojo(Plain Old Java Objects一个普通的java类)的,可以定义属性和方法,但需要遵循一些规则:●属性的名字必须遵守与 JavaBeans 属性名相同的命名规则. 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生●必须有一个不带参的构造器●至少有一个供 struts 在执行这个 action 时调用的方法,方法的返回值为String类型(即视图名称)●同一个 Action 类可以包含多个 action.●Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例4. result 元素配置 action 的执行结果name: 配置result结果名称,根据action执行方法的返回值决定找那个 result默认为 successtype: result 结果类型,默认为 dispatcher 类型常用的result类型●dispatcherdispatcher 结果类型是最常用的结果类型, 也是 struts 框架默认的结果类型用于将控制权转发给web应用中的其他资源默认参数:location 用于指定转发的资源路径,通常为一个jsp页面●redirect用于将响应重定向到另一个资源参数:location : 指定重定向的资源路径parse : 指定是否将location的值视为一个 OGNL 表达式来解析默认值为true●redirectAction用于将响应重定向给另一个Action参数:actionName : 指定目标action, 该属性为默认属性namespace : 指定目标 action 所在的 package●chain用于构成一个 Action 链,前一个action将控制权转发给下一个action,并且前一个action的状态在后一个action中继续保持参数:actionName : 指定目标action, 该属性为默认属性namespace : 指定目标 action 所在的 packagemethod :指定调用action的方法,默认调用 execute 方法●httpheader用于将把一个 HTTP 状态发送到浏览器默认参数 status :指定状态码●plaintext将转发的资源作为文本输出 , 不常用。
struts2基本学习教学

继续框架的学习:Struts2:MVC ←→SpringMVC (不要打架)Oracle:DB ←→MySQL (一些语法还是有差异的,不要打架) Hiberante:DAO ←→MyBatis (都是实现持久化的,不要打架)SSH整合的一个简单的CRUD案例!SSH: spring struts2 hibernate1,Struts2框架是一个MVC框架M(javabean) V(view) C(前端(核心)控制器,业务控制器)2,阐述Struts2的框架原理请求到达前端(核心)控制器从ActionMapper对象中查找ActionMapping对象获得ActionInvoker对象并执行Action返回视图3,在编写Struts2代码之前再介绍一个框架(了解)Struts2是Struts1的一个”延伸”(其实两个框架没有关系)其实Struts2的前身并不是struts1,它其实来自另一框架:webworkStruts1这个框架的控制器是Servlet,这个框架与servlet是严重耦合的!(ActionServlet)Struts1中的控制器是单例的!Struts2跟Servlet无关!Struts2中的控制器是多例的!4,开发Struts2的项目(学框架就是用别人的东西,学别人定义的规则)1)引入JAR包commons-fileupload-*.*.jar : 实现文件上传commons-logging-*.*.jar : apache下提供的一个日志包freemarker-*.*.jar : 提供视图解析的ognl-*.*.jar: struts2中的一个新特性,提供对象图导航语言struts2-core-*.*.jar :struts2的核心包xwork-core-*.*.jar : webwork的核心包2)在开发之前介绍几个文件:在struts2-core-*.*.jar中文件:struts-default.xml满足约束:文件中定义了组件:<bean> : 是struts2中要使用的bean对象<result-type> : 定义了struts2中视图的响应方式<interceptor>: 定义拦截器在struts2-core-*.*.jar中的org.apache.struts2包中文件:default.properties文件中定义开发的语言环境以及url的默认扩展名3)开发31)配置核心控制器(是一个过滤器) 在web.xmlorg.apache.struts2.dispatcher.FilterDispatcher (过时)org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter (使用)32)View –> JSP编写自己的配置文件:在src下struts.xml满足33)编写ActionAction可以是一个普通的javabean,不需要实现任何接口或者继承任何类!(当然也可以去实现Action接口或者继承ActionSupport类)视图传值给Action:规则是视图组件的name必须和action中的属性名保持一致!!(注:方法的执行顺序Setter –> execute)5,如果在Action中要使用request,response,session,application对象,struts2框架提供了如下机制:去实现XxxAware接口6,如果在struts.xml中希望有多个action的name相同,可以使用不同package进行管理。
SSI框架

框架简介:相信大家对于mvc的三层架构已经灰常熟悉了,个人感觉ssi的框架结构还是比较典型的mvc三层架构,还是比较容易上手的。
ssi的框架主要是由struts2,spring以及ibatis组成,他们负责各层之间的交互与协作,从而实现整个web端的功能实现与整合。
Struts目前主要负责数据传递和控制方面,spring则依靠其强大的依赖注入技术实现了类似bean 托管和整合等功能,当然这只是spring功能中的冰山一角,而ibatis作为一种轻量级的OR Mapping框架,提供了半自动化对象关系映射的实现,自由度相对于hibernate更高。
框架结构:这是我在网上找到的一张关于ssi框架的结构图,个人感觉画的还是蛮不错的,对于入门者来说,层次机构很清晰,比较实用(感谢这位大大的分享):在这里可以很明显的看出ssi框架的大体结构以及各层之间的交互情况,顶层表现层的话,就java而言主要是jsp,html等视图层技术的编写,其中涉及我们熟悉的javascript,jquery以及j-ui等。
在控制层来说的话,主要是利用strust2标签功能实现action与视图层的数据交互,当然也可以使用ajax的技术实现同样的功能,这个就按个人喜好而来了。
在业务逻辑层。
主要是利用spring的依赖注入实现对业务逻辑类和dao类的实例托管,当然各类的实例都可以托管在spring中进行统一管理和关联,包括事务,数据源等等。
在持久层,利用ibatis提供的半自动化对象关系映射的实现,开发人员可以根据需要编写具体的sql语句,通过相应的xml的配置实现对数据库的操作。
总之,SSI框架能够降低我们代码的耦合度,增强了代码的健壮性和可重用性,加快了开发速度,但是也有一些不足之处,比如由于三种框架的配置文件较多,也给我们带来了一些不便,特别是对于较小的应用来说更是如此。
相关demo介绍:基于之前对ssi框架的学习,我也不能免俗滴选择了做一个用户管理的web实现,项目的大致框架如下:大体上还是按照三层的分层模型来是分的,具体就不详细说了,相信大家也应该很了解整个结构的。
Eclipse开发struts2教程-黑山-2009-01-20

研发部文档中心 文档编号 产品版本 密级2.0 一般名称:使用Eclipse开发struts2教程 共 页使用Eclipse开发struts2教程(仅供内部使用)(注:文档命名规则:文档名+版本号-作者-时间)例如:新浪宁波网短信业务概要设计2.0-黑山-2005-05-23.doc拟制: 黑山 日期: 2009/01/20审核: 日期:审核: 日期:批准: 日期:版权所有 不得复制使用Eclipse开发struts2教程关键词:J2EE,iBatis,ORM摘 要: 本文档是eclispe开发struts2的一个教程学习文档。
缩略语清单:ORM:Object Relation Map注意在引用这些缩略语是注意区别大小写,没有在此出现的不能被直接引用。
例如:EJB统一为大写。
注:缩略语需要根据情况增减修改历史:修改历史清单作者 名称 时间黑山 初稿 2009-01-20一、 安装1.安装Eclipse:去/downloads/网站上下载Eclipse IDE for Java EE Developers(开发JA V A EE的IDE)。
然后解压缩即可使用!假设解压缩到D:\eclipse目录。
2.安装struts for eclipse的插件:(如果不想安装这个插件也可以,只是action映射文件要自己配置了)去/网站上下载Alveole 这个插件也可以直接在线安装(比较慢)。
先说直接下载插件再安装,下载下来以后解压缩,得到features和plugins 两个目录,直接把这两个目录拷贝到d:/eclipse目录下即完成插件的安装。
在线安装方法:运行eclipse.exe,然后找到:然后点Add site:在在线更新的地址拦里输入地址:/update/:确定以后形如:然后选中需要安装的项目,点击install安装即可完成安装,其他可在线安装的插件安装方法也一样!比如ibatis插件的安装,可以去/ibator.html下载插件,然后除了输入一个远程在线安装地址以外,还可以选择一个本地的文件夹(该文件夹包含features 和plugins目录以及site.xml文件);也可以选择一个本地安装压缩包,这个zip包里包含了features和plugins目录以及site.xml文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
让你的sturts2跑起来:1.准备如下jar包2.actionpackage action;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletContext;import org.apache.struts2.ServletActionContext;import busi.impl.ticketBizImpl;import entity.Ticket;public class TicketAction {private String times;// 车次private String beginStation;// 出发站private String endStation;// 终点站private String beginTime;// 出发时间private String endTime;// 到站时间private Double ticketMoney;//票价private int lostTicket;// 剩余票数private String times2;//售票private String beginTime2;//售票private int piaoshu;//售出票数private int pageNo=1;//页数private int currentPage;//当前页ticketBizImpl tbi = new ticketBizImpl();List<Ticket> tickets = new ArrayList();public String addTicket() {System.out.println("开始调用TicketAction插入数据");String t = tbi.addTicket(times, beginStation, endStation, beginTime, endTime, ticketMoney, lostTicket);System.out.println("插入ticket成功!");return "addTicket";}public String queryAllTicket(){tickets = tbi.queryAllTicket();return "queryTicket";}public String queryTicketByTimes(){if(this.times == null){tickets = tbi.queryTicketByStartNumAndEndNum(1, 4);}elsetickets = tbi.queryTicketByTimes(times);return "queryTicket";}public String ShouPiaoqueryTicketByTimes(){System.out.println(times);if(this.times == null){tickets = tbi.queryTicketByStartNumAndEndNum(1, 4);}else tickets = tbi.queryTicketByTimes(times);return "modifyTicket";}public String queryTicketBybeginStationAndEndstation(){tickets = tbi.queryTicketByBeginstationAndEndstation(beginStation, endStation);return "queryTicket";}public String queryTicketBybeginStationEndStationAndbeginTime(){tickets = tbi.queryTicketByBeginStationEndstationAndbeginTime(beginStation, endStation, beginTime);return "queryTicket";}//分页每页四条public String queryTicketByStartAndEndNum(){System.out.println("Action层:::::::页数"+pageNo);tickets = tbi.queryTicketByStartNumAndEndNum(4,(pageNo-1)*4);ServletContext sc = ServletActionContext.getServletContext();if(sc.getAttribute("username")==null){System.out.println("未登陆用户!");return "indexQueryTicket";}else{System.out.println("已登陆用户!");return "queryTicket";}}public String shouTicket(){System.out.println("action层测试"+this.piaoshu);System.out.println("action层测试"+this.getTimes2());System.out.println("action层测试"+this.getBeginTime2());tbi.shouTicket(piaoshu,times2,beginTime2);tickets = tbi.queryTicketByStartNumAndEndNum(1, 4);return "queryTicket";}public String modifyTicket(){tbi.modifyTicket(times, beginStation, endStation, beginTime, endTime, ticketMoney, lostTicket);return "modifyTicket";}public String getTimes() {return times;}public void setTimes(String times) {this.times = times;}public String getBeginStation() {return beginStation;}public void setBeginStation(String beginStation) {this.beginStation = beginStation;}public String getEndStation() {return endStation;}public void setEndStation(String endStation) {this.endStation = endStation;}public String getBeginTime() {return beginTime;}public void setBeginTime(String beginTime) {this.beginTime = beginTime;}public String getEndTime() {return endTime;}public void setEndTime(String endTime) {this.endTime = endTime;}public Double getTicketMoney() {return ticketMoney;}public void setTicketMoney(Double ticketMoney) { this.ticketMoney = ticketMoney;}public int getLostTicket() {return lostTicket;}public void setLostTicket(int lostTicket) {this.lostTicket = lostTicket;}public ticketBizImpl getTbi() {return tbi;}public void setTbi(ticketBizImpl tbi) {this.tbi = tbi;}public List<Ticket> getTickets() {return tickets;}public void setTickets(List<Ticket> tickets) { this.tickets = tickets;}public int getPiaoshu() {return piaoshu;}public void setPiaoshu(int piaoshu) {this.piaoshu = piaoshu;}public String getTimes2() {return times2;}public void setTimes2(String times2) {this.times2 = times2;}public String getBeginTime2() {return beginTime2;}public void setBeginTime2(String beginTime2) {this.beginTime2 = beginTime2;}public int getPageNo() {return pageNo;}public void setPageNo(int pageNo) {this.pageNo = pageNo;}}3.config一,sqlmap-Ticket.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-////DTD SQL Map 2.0//EN""/dtd/sql-map-2.dtd"><sqlMap namespace="userSql"><typeAlias alias="ticket" type="entity.Ticket"/><!-- 添加车票信息--><insert id="addTicket" parameterClass="ticket">INSERT INTO Ticket(times, beginStation, endStation, beginTime, endTime, ticketMoney, lostTicket)VALUES (#times#, #beginStation#, #endStation#, #beginTime#, #endTime#, #ticketMoney#, #lostTicket#)</insert><!-- 根据车次删除车票信息--><delete id="deleteTicketByTimes" parameterClass="ng.String">DELETE FROM TicketWHERE (times = #times#)</delete><!-- 根据车次和起始时间删除车票信息--><delete id="deleteTicketByTimesAndBeginTime" parameterClass="java.util.Map">DELETE FROM TicketWHERE (times = #times#) AND (beginTime = #beginTime#)</delete><!-- 查询所有车票信息--><select id="queryAllTicket" resultClass="ticket">SELECT *FROM Ticket</select><!-- 根据车次查询车票信息--><select id="queryTicketByTimes" resultClass="ticket" parameterClass="ng.String"> SELECT *FROM TicketWHERE (times = #times#)</select><!-- 根据车次和起始时间查询车票信息--><select id="queryTicketBybegintimeAndTimes" resultClass="ticket"parameterClass="java.util.Map">SELECT *FROM TicketWHERE (beginTime = #beginTime#) AND (Times = #times#)</select><!-- 根据起始终点站查询车票信息--><select id="queryTicketBybeginStationAndendStation" resultClass="ticket" parameterClass="java.util.Map">SELECT *FROM TicketWHERE (beginStation = #beginStation#) AND (endStation = #endStation#)</select><!-- 根据起始终点站和出发时间时间查询车票信息--><select id="queryTicketBybeginStationendStationAndbeginTime" resultClass="ticket" parameterClass="java.util.Map">SELECT *FROM TicketWHERE (beginStation = #beginStation#) AND (endStation = #endStation#) AND (beginTime = #beginTime#)</select><!-- 售票--><update id="shoupiao" parameterClass="java.util.Map">UPDATE TicketSET lostTicket = lostTicket - #piaoshu#WHERE (times = #times#) AND (beginTime = #beginTime#)</update><!-- 修改车票信息--><update id="modifyTicket" parameterClass="java.util.Map">UPDATE TicketSET times = #times#, beginStation = #beginStation#, endStation = #endStation#, beginTime = #beginTime#, endTime = #endTime#, ticketMoney = #ticketMoney#, lostTicket = #lostTicket# WHERE (times = #times#) AND (beginTime = #beginTime#)</update><!-- 查询票数数量--><select id="queryTicketNum" resultClass="ng.Integer">SELECT COUNT(*) AS Expr1FROM Ticket</select><!-- 分页--><select id="queryBybeginRownumAndEndRownum" resultClass="ticket" parameterClass="java.util.Map">SELECT TOP $pageNum$ *FROM TicketWHERE (ID NOT IN(SELECT TOP $ticketNum$ idFROM TicketORDER BY id))ORDER BY ID</select></sqlMap>二,struts-Ticket.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="ticket" extends="struts-default"><action name="TicketAction!*" class="action.TicketAction" method="{1}"> <result name ="addTicket">/Admin/addTicket.jsp</result><result name="queryTicket">/Admin/queryTicket.jsp</result><result name="indexQueryTicket">/index.jsp</result><result name="modifyTicket">/Admin/modifyTicket.jsp</result></action></package></struts>4.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><style type="text/css"><!--body,div,ul,li{margin:0 auto;padding:0;}body{font:12px "宋体";text-align:center;}a:link{color:#00F;text-decoration:none;}a:visited {color: #00F;text-decoration:none;}a:hover {color: #c00;text-decoration:underline; }ul{list-style:none;}.main{clear:both;padding:20px;text-align:center;}#tabs1{text-align:left;width:400px;}.menu1box{position:relative;overflow:hidden;height:22px;width:400px;text-align:left;}#menu1{position:absolute;top:0;left:0;z-index:1;}#menu1 li{float:left;display:block;cursor:pointer;width:72px;text-align:center;line-height:21px;height:21px;}#menu1 li.hover{background:#fff;border-left:1px solid #333; border-top:1px solid #333; border-right:1px solid #333; }.main1box{clear:both;margin-top:-1px;border:1px solid #333;height:60px;width:900px;}#main1 ul{display: none;}#main1 ul.block{display: block;}--></style></head><body><li><form action="TicketAction!ShouPiaoqueryTicketByTimes.action" method="post"><table><td >车 次:<input type="text"name="times"/> <input type="submit" value="查询"/></td></table></form></li><table border="1" cellpadding="0" bordercolor="skyblue" width="100%" align="center"> <thead><tr bgcolor="skyblue"><td align="center">车次</td> <td align="center">出发站</td> <td align="center">终点站</td> <td align="center">出发时间</td><td align="center">到站时间</td><tdalign="center">票价</td><td align="center">剩余票数</td><td align="center">操作</td> </tr></thead><s:iterator value="tickets"><tr align="center"><td width="11%"><input type="text" value="${times}" readonly="readonly"align="middle" size="15"></input></td><td width="11%"><input type="text" value="${beginStation}" readonly="readonly" align="middle" size="15"></td><td width="11%"><input type="text" value="${endStation}" readonly="readonly" align="middle" size="15"></td><td width="14%"><input type="text" value="${beginTime}" readonly="readonly"align="middle" size="15"></input></td><td width="15%"><input type="text" value="${endTime}" readonly="readonly"align="middle" size="10"></td><td width="10%"><input type="text" value="${ticketMoney}" readonly="readonly" align="middle" size="10"></td><td ><input type="text" value="${lostTicket}" readonly="readonly" align="middle"size="10"></td><td width="12%"><input type="submit" value="修改车票"/> <inputtype="reset" value="删除车票"/></td></tr></s:iterator></table><center><ahref="TicketAction!queryTicketByStartAndEndNum.action?pageNo=${pageNo-1}">上一页</a><ahref="TicketAction!queryTicketByStartAndEndNum.action?pageNo=${pageNo+1}">下一页</a></center></body></html>。