zoukankan      html  css  js  c++  java
  • Struts2 HelloWorld_1

    新建web Project:struts2_0100_introduction

    下载:Struts-2.1.6.zip

    解压后,在apps文件夹下面有5个*.war文件,解压struts2-blank.war文件

      得到:struts.xml文件和lib目录下面的所有*.jar文件

      把得到的struts.xml文件复制到我们项目的src目录下面;

      Build Path的时候把lib目录下面的jar文件添加进我们的项目,虽然说有些jar文件

    对我们现在的项目带来好处,但是我们为了简单起见就一起给添加进来了,这样做也

    也是为了保险。^_^

      修改web.xml文件:

    ------------------------------------Hongten--------------------------------------

    web.xml

    代码;

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
     </filter>

     <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
     </filter-mapping>


     <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
    </web-app>

    ------------------------------------Hongten--------------------------------------

    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>
        <package name="default" namespace="/" extends="struts-default">
            <action name="hello">
                <result>
                    /Hello.jsp
                </result>
            </action>
        </package>
    </struts>

    ------------------------------------Hongten--------------------------------------

    Hello.jsp

    代码:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
       
        <title> Hello Struts2</title>
     <meta http-equiv="pragma" content="no-cache">
     <meta http-equiv="cache-control" content="no-cache">
     <meta http-equiv="expires" content="0">   
     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     <meta http-equiv="description" content="This is my page">
     <!--
     <link rel="stylesheet" type="text/css" href="styles.css">
     -->
      </head>
     
      <body>
        Hello Struts2<br>
      </body>
    </html>

    ------------------------------------Hongten--------------------------------------

    部署项目后,启动服务器,输入:http://localhost:1000/struts2_0100_introduction/hello.action

    浏览器输出:

    Hello Struts2

    当然这里可以直接输入:http://localhost:1000/struts2_0100_introduction/hello

    效果也是一样的;

    ------------------------------------Hongten--------------------------------------

    测试二:

    我们要想在修改我们的程序后,不用重新启动服务器等一些麻烦的操作

    如:

    <action name="hello_struts">

      <result>  

        /Hello.jsp

      </result>

    </action>

    修改后我们不用重启服务器,就能让我们的程序运行起来

    这时,我们如果不做任何的配置或部署的话,直接运行会报错的

    如错误信息:

    HTTP Status 404 - There is no Action mapped for namespace / and action name hello_struts.


    type Status report

    message There is no Action mapped for namespace / and action name hello_struts.

    description The requested resource (There is no Action mapped for namespace / and action name hello_struts.) is not available.

    那么我们应该怎样配置才可以解决这种情况呢?

    修改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="default" namespace="/" extends="struts-default">
            <action name="hello_struts">
                <result>
                    /Hello.jsp
                </result>
            </action>
        </package>
    </struts>

    这样配置以后,我们修改上面的代码后,就可以很方便的运行程序,不需要重新部署项目

    ------------------------------------Hongten--------------------------------------

    我们来看看这个小程序的运行机制:

      现在有一个客户端在浏览器上面输入一个url地址:http://localhost:1000/struts2_0100_introduction/hello

    当他输入这个url地址之后,这个url请求会通过http协议发送给我们的tomcat服务器;

    tomcat收到这个请求之后,会看,这个请求的是哪个web application呢?是这个struts2_0100_introduction

    这个web application,所以他就把这个web application交给我们对应的程序去处理,这是他就会去读取

    struts2_0100_introduction这个web application中的web.xml配置文件。这是就发现我们在web.xml中的一个

    配置:

    <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
     </filter>

     <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
     </filter-mapping>

    在这个web.xml中配置了一个filter,而这个filter会过滤所有的url地址,所以当url地址中的hello就会被

    filter过滤掉,被org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter接收到;

    他会怎样处理呢?

    他会首先看namespace:“/”

    然后到struts.xml中去查,当中有一个namespace="/"

    在url中的  "/"  后面是:hello

    接下来会在去查这个 "/"  下面有没有action name="hello"

    如果有,就会执行result中的

    /Hello.jsp,  就把Hello.jsp的结果显示在浏览器上或者客户端的浏览器上面;

    ------------------------------------Hongten--------------------------------------

    总结:

    有人可能会问了,我们为什么要搞这么复杂啊?

    我们直接访问Hello.jsp不就完事儿了吗!不是挺爽的吗?为什么搞这么麻烦?

    想一想,struts2这样做肯定有他这样做的好处,你说是不是啊?

    我们原来学过设计模式,设计模式有一个典型 的特点:就是一定要把简单的东西给他复杂化

    他为什么要这样复杂化呢?复杂化后带来的好处是什么?

    最重要的是就是扩展性很好,而struts2带来的好处也是一样的,他为什么搞这么麻烦?

    中间要经过一次中转,一次请求来了之后,要经过一次中转才可以拿到我们想要的东西

    他的好处是可以把请求和最后要拿到的结果(视图)给他分开,而不像原来那样之间写死。

    分开之后的好处是:如果我们现在要换成其他视图如:Hello1.jsp

    我们可以直接在struts.xml中修改:

    <result>

      /Hello1.jsp

    </result>

     这样就可以了,这样会更灵活,这就是她的好处

    所以struts解决的问题就是:把请求和视图分开

    ------------------------------------Hongten--------------------------------------

    感谢:尚学堂-马士兵

    ------------------------------------Hongten--------------------------------------

  • 相关阅读:
    iOS 中使用 XIB 自定义cell的两种方法以及编译出现常见 的错误 (xcode6.0之后)
    iOS中 学会如何对sqlite3 进行封装
    杭电ACM2012素数判定
    杭电ACM2503a/b+c/d
    杭电ACM2005第几天
    杭电ACM2034人见人爱AB
    杭电ACM2502月之数
    杭电ACM2001计算两点间的距离
    杭电ACM2002计算求得体积
    杭电ACM2033人见人爱A+B
  • 原文地址:https://www.cnblogs.com/hongten/p/2121194.html
Copyright © 2011-2022 走看看