研磨struts2 第二章 Struts 2的HelloWorld
2011-12-19 11:26
459 查看
2.1 概述
通过第1章的讲述,明白了Struts 2是什么、有什么以及能干什么,接下来就该来讨论怎么做的问题了,也就是讨论如何使用Struts 2来开发基于MVC的web应用。按照惯例,学习一个新的东西,都是从HelloWorld起步的,这里也不例外,本章就一起来看一个Struts 2的HelloWorld实现。
本章会从搭建Struts 2的开发环境开始,用Struts 2来开发一个简单的HelloWorld,以便大家熟悉一下Struts 2的基本开发方式以及各部分的写法。
在HelloWorld中,不去实现复杂的业务逻辑,只做一个简单的登录功能。提供一个登录页面,让用户输入用户名和密码然后提交请求;在动作Action里面取得登录页面输入的数据,然后模拟业务层处理登录请求并返回简单的信息,最后跳转到欢迎页面,在欢迎页面上输出这个登录的账号信息。
2.2 准备开发环境和运行环境
要开始Struts 2的开发,需要先准备Struts 2的开发环境和运行环境。Struts 2的开发环境直接选用Eclipse,而运行环境就选用最常见的Tomcat,下面分别介绍一下。2.2.1 配置JDK
使用Eclipse来开发自然需要使用JDK,JDK的下载和安装这里就不去赘述了,直接配置需要的环境变量,主要是JAVA_HOME和path。例如本书示例所用的环境,把JDK安装在E:\Struts 2\jdk\jdk1.6。
安装之后要设置环境变量,在桌面上右击“我的电脑”图标,选择“属性”→“高级”→“环境变量”中设置java所需要的环境变量。设置JAVA_HOME,变量值为jdk的安装目录,如图2-1所示。
图2-1 环境变量JAVA_HOME设置
设置path,变量值为jdk的安装目录下的bin文件夹($JAVA_HOME/bin),如图2-2所示。
图2-2 环境变量path设置
2.2.2 下载并安装Eclipse
Eclipse版本繁多,这里推荐使用eclipse-jee-europa,本身是免费的,而且功能也很强大。至于有些朋友习惯使用MyEclipse,由于MyEclipse是商业的收费软件,这里就不推荐使用了。eclipse-jee-europa是Eclipse官方提供的JEE开发环境,以Eclipse3.3为基础,加上了IBM官方的web开发工具WTP等。可以直接到Eclipse的官网http://www.eclipse.org去下载最新的版本。也可以直接到以下链接地址去下载:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/europa/winter/eclipse-jee-europa-winter-win32.zip。
Eclipse本身是绿色的,直接解压即可。比如写作本书所用的Eclipse的解压路径为E:\Struts 2\ide\eclipse-jee-europa-winter-win32。
解压后,直接双击里面的eclipse.exe即可打开Eclipse,会看到图2-3所示的欢迎页面。
图2-3 eclipse-jee-europa的欢迎页面
关闭欢迎页面,会看到Java EE透视图的默认布局,如图2-4所示。
图2-4 Java EE透视图的默认布局
可以按照自己的习惯重新布置各个视图,如图2-5所示,以后再讲解时就使用图中的视图布局。
图2-5 按照自己的习惯设置视图的布局
(1)把Outline视图放到工作台的左下角。
(2)把Servers视图放到工作台的左下角。
(3)选择Window→Show View→Package Explorer命令,将视图放到工作台的左上角。
(4)关闭Project Explorer视图。
(5)关闭Data Source Explorer视图。
(6)关闭Snippets视图。
(7)选择Window→Show View→Console命令,将视图放到工作台的右下角。
2.2.3 下载Tomcat并在Eclipse里面引用Tomcat
访问Tomcat的官网http://tomcat.apache.org,会看到Tomcat已经更新到7.0了,但是为了方便与eclipse-jee-europa连起来使用,下载Tomcat 6.0就可以了。当然也可以自己选择合适的版本下载,下面是无须安装的Tomcat 6的下载连接:http://apache.freelamp.com/tomcat/tomcat-6/v6.0.29/bin/apache-tomcat-6.0.29-windows-x86.zip。
前面下载的Tomcat无须要安装,直接解压即可使用。当然,如果需要把Tomcat安装为Windows服务,那就需要下载安装的版本。这里直接把压缩包解压即可,比如本书示例所用的环境:解压在E:\Struts 2\server\apache-tomcat-6.0.29。
现在来让Eclipse引用刚刚下载的Tomcat 6.0。
在Eclipse上面的菜单条上找到Window首选项,选择Window→Preferences→Server→Installed Runtimes命令,会得到如图2-6的页面。
图2-6 安装服务器页面
单击Add命令,会转向服务器选择页面,如图2-7所示。
图2-7 服务器选择页面
选择Tomcat 6.0,单击Next,会跳转到Tomcat安装路径选择页面,如图2-8所示。
图2-8 Tomcat 6.0安装路径选择页面
单击Browse按钮,会弹出文件夹选择页面,选择在本节中Tomcat的安装路径(前面安装在E:\Struts 2\server\apache-tomcat-6.0.29)。然后依次单击图2-8的Finish和图2-6的OK按钮,就完成了在Eclipse中引用Tomcat。
2.2.4 下载Struts 2以及认识Struts 2包结构
到Struts 2的官网http://struts.apache.org下载Struts 2的最新版本2.1.8的all-in-one包,也可以直接使用下面的下载地址http://labs.renren.com/apache-mirror/struts/binaries/struts-2.1.8.1-all.zip。
直接解压下载得到的压缩包,可以得到如下的文件夹结构,如图2-9所示。
图2-9 Struts 2 all-in-one包结构
解压后,文件夹的根目录下(struts-2.1.8.1)都是一些LICENSE文件。
l src目录中是Struts 2的源代码。
l lib目录中是Struts 2的jar包和Struts 2依赖的jar包。
l docs目录中是Struts 2的官方文档,虽然是英文的,但是很多最新最准确的知识都能从这个官方文档里得到。
l apps目录中有5个war文件,是Struts 2的官方示例,里面是完整的可以运行的Web应用。
l 到这里,基本的准备工作就做好了。
2.3 从Servlet+JSP+JavaBean实现MVC开始
2.3.1 起点概述
考虑到大部分朋友都是有一定经验的web开发者,因此从Servlet+JSP+JavaBean实现MVC开始,再过渡到Struts 2的开发,这样能让大家把以前的知识自然迁移到Struts 2上,使得学习曲线变得平滑。说明一下,由于本机的8080端口被别的软件占用了,所以把Tomcat改到了9080端口,以后在程序里出现的时候,也将是9080。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> |
比如Tomcat安装在E:\Struts 2\server\apache-tomcat-6.0.29,因此需要修改的配置文件在E:\Struts 2\server\apache-tomcat-6.0.29\conf\server.xml。
2.3.2 建立动态的Web工程
为了使用eclipse-jee-europa中各种与Web开发相关的功能,先来建立一个动态的Web工程。(1)在Package Expolorer视图中的空白处右击,选择New→Project命令,在弹出页面选择Web文件夹下的Dynamic Web Project选项,如图2-10所示的页面。
图2-10 选择新建动态Web工程
(2)选择其中的Dynamic Web Project命令,单击Next按钮。会跳转到如图2-11所示的页面。
图2-11 建立Web工程的配置1
(3)输入项目名HelloWorld之后,然后选择Target Runtime的值为Apache Tomcat v6.0 ,这样Eclipse会帮助导入Tomcat下所有的jar包,然后单击Next按钮,得到如图2-12所示的页面。
图2-12 建立Web工程的配置2
(4)使用默认的配置,单击Next按钮,得到如图2-13所示的页面。
图2-13 建立Web工程的配置3
(5)修改Context Root的值为小写的helloworld,默认是工程名字,是HelloWorld。至于WebContent改不改,就看用户的习惯了,一般用默认的就好了。
单击Finish按钮,一个动态的Web工程就创建好了。
2.3.3 配置工程运行环境
在Servers视图中空白处单击,选择New→Server命令,得到如图2-14所示页面。图2-14 选择新建服务器
选择Tomcat v6.0 Server选项,单击Next按钮,得到如图2-15所示的页面。
图2-15 选择Web工程
选择HelloWorld工程,单击Add按钮,把工程添加到右边的列表,然后单击Finish按钮,就完成了配置。这时候,在Package Explorer里会增加一个叫Servers的工程,这是Eclipse自动管理的,暂时不需要修改这个工程中的任何文件。
2.3.4 编写JavaBean
用Model2来实现MVC,模型部分是使用JavaBean来实现的,而且视图和控制器之间的数据交互也是通过JavaBean来实现的,因此先来把JavaBean编写好。这里不需要实现什么复杂的业务逻辑,只是一个简单的数据封装model,有3个属性,分别是account、password和submitFlag,其中的submitFlag是用来封装提交请求的标记,为它们提供相应的getter和setter方法,示例代码如下:
package cn.javass.hello.servletimpl.vo; public class HelloWorldModel { private String account; private String password; private String submitFlag; public String getAccount() { return account; } public void setAccount(String account) { this.account=account; } public String getPassword() { return password; } public void setPassword(String password) { this.password=password; } public String getSubmitFlag() { return submitFlag; } public void setSubmitFlag(String submitFlag) { this.submitFlag=submitFlag; } public String toString(){ return "account="+account+",password="+password +",submitFlag="+submitFlag; } /** * 示例方法,表示可以执行业务逻辑处理的方法, * 比如对数据进行增删改查的操作等 */ public void businessExecute(){ System.out.println("正在进行业务处理=======>"); } } |
2.3.5 编写Servlet
Servlet在Model2中的作用相当于MVC中的控制器,这里只是一个简单的实现,基本的实现主要有如下工作:(1)收集Request传递过来的参数。
(2)把这些参数组织成为模型需要的类型。
(3)调用模型进行逻辑功能处理。
(4)选择下一个页面,先准备好下一个页面需要的数据,然后转向下一个页面。
先来建立Servlet,在src下面先建包cn.javass.hello.servletimpl.servlet,然后在这个包下新建一个类HelloWorldServlet,这个类继承HttpServlet,并重写父类的doPost和doGet方法,其中doGet方法只是转调一下自己的doPost方法即可。在Servlet的doPost方法中,完成上面提到的工作。代码示例如下:
package cn.javass.hello.servletimpl.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.javass.hello.servletimpl.vo.HelloWorldModel; public class HelloWorldServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ //1:收集参数,不用做了,通过JavaBean传入 //2:组织参数,也不用做了,已经组织好了,把数据封装成了JavaBean //这里只需要获取封装好的JavaBean即可 HelloWorldModel hwm=(HelloWorldModel)request.getAttribute("helloModel"); //3:调用模型的逻辑功能处理 hwm.businessExecute(); //这里简单地输出一下传入的参数 System.out.println("用户输入的参数为==="+hwm); //4:根据逻辑处理的结果来选择下一个页面,这里直接选择转向欢迎页面 //4.1:先把需要欢迎页面显示的数据准备好 request.setAttribute("hwm",hwm); //4.2:转向欢迎页面 request.getRequestDispatcher("/servletimpl/welcome.jsp").forward(request,response); } } |
2.3.6 配置web.xml
在web.xml中,配置上面做好的Servlet,配置示例如下:<servlet> <servlet-name>hello</servlet-name> <servlet-class>cn.javass.hello.servletimpl.servlet.HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> |
2.3.7 编写登录页面
在项目的WebContent文件夹下创建一个servletimpl的文件夹,然后在servletimpl文件夹上右击,选择New→Other→JSP命令,创建一个名称为login的jsp页面,然后修改里面的“ISO-8859-1”为“gb2312”。登录页面提供让用户填写用户名和密码的表单,用户填写好过后,可以单击提交按钮来向Servlet发出登录请求,示例代码如下。
<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>Insert title here</title> </head> <body> <jsp:useBean id="helloModel" class="cn.javass.hello.servletimpl.vo.HelloWorldModel" scope="request"></jsp:useBean> <jsp:setProperty name="helloModel" property="*"/> <% if("login".equals(helloModel.getSubmitFlag())){ %> <jsp:forward page="/hello"></jsp:forward> <% } %> <form action="/helloworld/servletimpl/login.jsp" method="post"> <input type="hidden" name="submitFlag" value="login"/> 账号:<input type="text" name="account"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="提交"> </form> </body> </html> |
2.3.8 编写欢迎页面
欢迎页面是完成登录功能过后跳转到的页面,用来显示欢迎信息,非常简单,只是简单地把需要展示的信息输出到页面上。
<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>Insert title here</title> </head> <body> <jsp:useBean id="hwm" class="cn.javass.hello.servletimpl.vo.HelloWorldModel" scope="request"></jsp:useBean> 欢迎账号为<%=hwm.getAccount() %>的朋友来访 </body> </html> |
2.3.9 测试示例
要测试上面写的示例,需要先启动Tomcat服务器,先选中Servers视图的里面的“Tomcat v6.0 Server at localhost”选项,然后单击Start的按钮,则会启动Tomcat 6.0,如图2-16所示。图2-16 启动Tomcat
等几秒钟,Tomcat启动的信息输出会出现在Console视图中,这就表示Tomcat启动成功了。
当Tomcat正常启动后,在浏览器窗口中输入如下地址并运行:http://localhost:9080/helloworld/servletimpl/login.jsp,会出现登录页面,如图2-17所示。
图2-17 访问登录页面
在登录页面输入账号和密码,单击“提交”按钮,则会跳转到相应的HelloWorldServlet。 HelloWorldServlet会先接收请求中的参数,然后在后台输出刚刚输入的数据,后台输出如下所示:
正在进行业务处理=======> 用户输入的参数为===account=test,password=test,submitFlag=login |
图2-18 欢迎页面
2.3.10 中文处理
示例做到这里,好像已经可以很好地工作了,但是,如果在账号里输入“中文”,会发现后台输出的信息和欢迎页面接收到的参数都是乱码,如下所示:正在进行业务处理=======> 用户输入的参数为===account=????,password=test,submitFlag=login |
图2-19 欢迎页面接收到的参数也是乱码
遇到中文问题了,该怎么处理呢?
在实际项目里会使用一个Filter来解决Tomcat的中文问题,这里不去讨论Filter的写法,在Tomcat的包中就有一个写好的处理字符集的filter,位置在下载的Tomcat的zip包下\webapps\examples\WEB-INF\classes\filters文件夹下面,名称是SetCharacterEncodingFilter.java。
为了示例简单,去掉了所有的注释,代码如下:
public class SetCharacterEncodingFilter implements Filter { protected String encoding=ull; protected FilterConfig filterConfig=null; protected boolean ignore=true; public void destroy() { this.encoding=null; this.filterConfig=null; } public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)throws IOException, ServletException { if (ignore||(request.getCharacterEncoding()==null)) { String encoding=selectEncoding(request); if (encoding!= null) request.setCharacterEncoding(encoding); } chain.doFilter(request, response); } public void init(FilterConfig filterConfig)throws ServletException { this.filterConfig=filterConfig; this.encoding=filterConfig.getInitParameter("encoding"); String value=filterConfig.getInitParameter("ignore"); if (value==null) this.ignore=true; else if (value.equalsIgnoreCase("true")) this.ignore=true; else if (value.equalsIgnoreCase("yes")) this.ignore=true; else this.ignore=false; } protected String selectEncoding(ServletRequest request) { return (this.encoding); } } |
<filter> <filter-name>encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>gb2312</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
相关文章推荐
- 第二章 STRUTS 2 下的 HelloWorld 转帖
- 《研磨struts2》 第二章 Struts2的HelloWorld 之 概述
- 《研磨struts2》 第二章 Struts2的HelloWorld 之从Servlet+JSP+JavaBean实现MVC开始
- 《研磨struts2》 第二章 Struts2的HelloWorld 之从Servlet+JSP+JavaBean实现MVC开始
- 《研磨struts2》 第二章 Struts2的HelloWorld 之从Servlet+JSP+JavaBean实现MVC开始
- 2008-4-8 第二章 STRUTS 2 下的 HelloWorld
- 最简单的Struts 2 HelloWorld
- 安卓应用开发第二章 - HelloWorld
- SSH(struts+spring+hibernate)迅速开发--第二章 SSH框架搭建(1)
- struts第一步--HelloWorld项目创建
- 《Kotlin 程序设计》第二章 快速开始:HelloWorld
- 第二章 建立一个Struts 2应用 转帖
- QT5 第二章、windows下Qt5.0.2-Helloworld发布
- Struts 2 学习笔记 - HelloWorld
- Eclipse3.5下的struts2的配置,以及建立第一个struts项目HelloWorld
- SSH(struts+spring+hibernate)迅速开发--第二章 SSH框架搭建(2)
- 整合Struts,Spring,mybatis三个框架的helloworld
- eclipse+Struts 2.3.4.1的HelloWorld
- 2008-4-9 第二章 建立一个Struts 2应用
- [第二章]第三节、扩展HelloWorld实例