研磨struts2 第二章 Struts 2的HelloWorld

 

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>

再次运行示例,会发现已经可以正常使用中文了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值