您的位置:首页 > 编程语言 > Java开发

研磨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" />

把上面配置中的8080改为9080即可。

比如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);
}
}
非常简单,对吧,接下来看看如何配置这个Servlet。

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>

配置分为<servlet>元素和<servlet-mapping>元素,它们都有一个子元素<servlet-name>,而<servlet>元素和<servlet-mapping>元素的<servlet-name>子元素里面注册的名字必须一样。<servlet>元素的子元素<servlet-class>用来注册Servlet类的全类名,也就是包的全路径再加上类名称,而<servlet-mapping>元素的<url-pattern>元素指明了这个Servlet响应哪些URL对应的请求。

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>
说明一下:<form>元素的action属性用来指定由谁来进行响应,由于这里使用JavaBean来收集页面的数据,因此需要先提交到本页面,然后再转向相应的servlet进行处理,其中的“/helloworld”为这个工程的Web上下文名,而“/login”是Servlet在Web工程中的资源名,和web.xml中的配置要对应(就是<servlet-mapping>元素的子元素<url-parttern>中的值)。

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

接着HelloWorldServlet会把这些数据设置到Request中,作为共享的数据传递给下一个页面,接下来就该跳转到下一个页面welcome.jsp,也就是欢迎页面了。欢迎页面会把HelloWorldServlet中传递过来的数据,输出到页面上,如图2-18所示。



图2-18 欢迎页面

2.3.10 中文处理

示例做到这里,好像已经可以很好地工作了,但是,如果在账号里输入“中文”,会发现后台输出的信息和欢迎页面接收到的参数都是乱码,如下所示:

正在进行业务处理=======>
用户输入的参数为===account=????,password=test,submitFlag=login

后台输出接收到的参数是乱码,再看看页面上的表现,如图2-19所示。



图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) {
returnthis.encoding);
}
}

然后在web.xml中进行配置,示例如下:

<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>

再次运行示例,会发现已经可以正常使用中文了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: