s有一天,教你开始truts2

写在前面

  • 他也是一个java和java web新秀。此前有过接触java web发展
  • 我想一个小项目。要熟悉struts2开发过程
  • 一个有趣的想法源于教研室项目上的一个功能实现–自己主动识别运营商,去做不同的处理。项目上採用的是IP地址库的方式,在本地做处理。这里为了简单就採用了淘宝提供的接口服务
  • 已经将该项目作为开源项目放在:IP地址仓库 欢迎大家前来点赞

能够学到什么

  • struts2的基本执行流程
  • HttpClient和org.json库的使用
  • 前端採用了bootstrap和ajax。做到了网页的自适应,后端返回json数据和前端交互

步入正题

  • struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<!-- 设置常量实现动态调用 -->
   <constant name="struts.enable.DynamicMethodInvocation" value="true" />
   <!-- 名字必须唯一相应模块 -->
   <package name="hello"  extends="json-default">
          <default-action-ref name="index" />
          <action name="index" class="action.IPSearchAction" method="index">
              <!--为了安全将其放在、WEB-INF/pages 不明确的也可放在webRoot  根文件夹下-->
                <result name="success">/WEB-INF/pages/ip.jsp  </result>
          </action>

          <action name="search" class="action.IPSearchAction" method="search">
              <!--为了安全将其放在、WEB-INF/pages 不明确的也可放在webRoot  根文件夹下-->
                <result name="success" type="json">
                    <param name="root">responseMap</param>
                </result>
          </action>
   </package>  

</struts>

  • web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <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>/WEB-INF/pages/ip.jsp</welcome-file>
  </welcome-file-list>
</web-app>
  • action文件
package action;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

public class IPSearchAction {

     String ip;          

     Map<String, Object> responseMap;   //查询的结果为json数据。struts2自己主动做序列化的工作

    public Map<String, Object> getResponseMap() {
        return responseMap;
    }

    public void setResponseMap(Map<String, Object> responseMap) {
        this.responseMap = responseMap;
    }   

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        System.out.println("input ip is: "+ip);
        this.ip = ip;
    }    

    public String search(){
        setOutputValue();
        return "success";
    }

   public String index(){
      return "success";
   }

   public void setOutputValue() {
       HttpClient httpclient = HttpClients.createDefault();
       System.out.println("the input ip is" + ip);
        URI uri = null;
        try {
            uri = new URIBuilder()
                .setScheme("http")
                .setHost("ip.taobao.com")
                .setPath("/service/getIpInfo.php")
                .setParameter("ip", ip)
                .build();
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        HttpGet httpget = new HttpGet(uri);

        HttpResponse response = null;
        try {
            response = httpclient.execute(httpget);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int statusCode = response.getStatusLine().getStatusCode();
        if(statusCode == HttpStatus.SC_OK) { //状态==200。返回成功
            String result = null;
            try {
                result = EntityUtils.toString(response.getEntity());
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(result);
            JSONObject resultJson  = new JSONObject(result);
            int code      = resultJson.getInt("code");
            String country = null;
            String region = null;
            String city = null;
            String county = null;
            String isp = null;
            if(code == 0) {
                country = resultJson.getJSONObject("data").getString("country");
                region = resultJson.getJSONObject("data").getString("region");
                city = resultJson.getJSONObject("data").getString("city");
                county = resultJson.getJSONObject("data").getString("county");
                isp = resultJson.getJSONObject("data").getString("isp");
                System.out.println("code is: "+ code + "country is: " + country + "area is "+region+"county is "+county+
                        "isp is "+isp);
            } 

            responseMap = new HashMap<String, Object>();
            responseMap.clear();
            responseMap.put("country", country);
            responseMap.put("region", region);
            responseMap.put("city", city);
            responseMap.put("county", county);
            responseMap.put("isp", isp);

        }
   }
}
  • 依赖的库文件

    说明:

    • project依赖org.json库。採用的是:org.json ,下载的是源码。能够打包成json.jar,更方便的使用
    • project依赖httpclient。下载地址:httpclient ,使用能够查看它提供的手冊
    • project还依赖struts2提供的某些jar包,记得加入

终于效果

PS:

一些问题记录:

參考资源

时间: 2024-10-14 00:32:29

s有一天,教你开始truts2的相关文章

【bzoj 4176】 Lucas的数论 莫比乌斯反演(杜教筛)

Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 一行一个整数ans,表示答案模1000000007的值. Sample Input 2 Sample Output 8 HINT 对于100%的数据n <= 10^9. 题解: 解锁新技能:杜教筛. 再复习一下: 若$F(n)=\s

Android开发之手把手教你写ButterKnife框架(二)

欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开发之手把手教你写ButterKnife框架(一)我们讲了ButterKnife是什么.ButterKnife的作用和功能介绍以及ButterKnife的实现原理. 本篇博客主要讲在android studio中如何使用apt. 一.新建个项目, 然后创建一个module名叫processor 新建m

客户:我考虑一下!销售高手教你该怎么逼单!

客户:我考虑一下!销售高手教你该怎么逼单! 2016-07-17 销售总监 做销售时的成交常见问题: 1. 客户很有意向购买我们的产品,然而我们的销售人员还在喋喋不休,等到尝试成交的时候客户再说:我在考虑.考虑..结果是客户一去不复返. 2. 客户的要求很明确,我们的产品他也满意.在成交那一瞬间,因为价格问题,无法达成一致,不了了之. 3. 客户对我们提供的方案没有大的问题,唯独提出一些瑕疵,而谈到价格问题,或者刁难销售人员,销售人员要么被顾客引导,或者我所是从,导致该成交却没有成交. 4.客户

手把手教你实现Spring ioc

手把手教你实现Spring ioc "Don't call us, we'll call you(不要联系我,我会主动联系你)" 这是好莱坞很经典的一句话,应用在ioc(控制反转)领域,发现理解起来相得益彰--你作为用户不需要控制业务实体的生成,交给我容器来控制,这就是控制反转.不过,这样理解起来也有点麻烦,套用面向对象大师Martin Fowler的说法更为贴切: "Dependency Inversion(依赖注入)" 当容器中所有的实体bean 都被管理起来的

深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录.在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解. iphone提供的数据持久化的方法,从数据保存的方式上讲可以分为三大部分:属性列表.对象归档.嵌入式数据库(SQLite3).其他方法. 一.属

程序流程图的作用 教你如何画程序流程图

程序流程图以其结构清晰.逻辑性强.操作简单好用而受到广泛使用.其作用是人们对解决问题的方法.思路或算法的一种描述.画流程图简单,可要画好一份专业的流程图就不是那么容易了.之前由于工作需要,累积了一点画流程图的经验,借此分享给大家,教大家轻松绘制一份专业的流程图. 1.想要画流程图,不借助软件简直画的你心情烦躁.建议大家下载迅捷流程图制作软件.(官网:http://liuchengtu.xjpdf.com)打开软件的界面是这样的↓↓,点击创建新图表或者打开现有图表. 2.点击创建新图表后,会弹出这

教你成为全栈工程师

教你成为全栈工程师(Full Stack Developer) 〇-什么是全栈工程师(2016-04-04) 教你成为全栈工程师(Full Stack Developer) 一-各显神通总结八大类编程语言的区别(2016-04-06) 教你成为全栈工程师(Full Stack Developer) 二-半小时学会网站开发(2016-04-08) 教你成为全栈工程师(Full Stack Developer) 三-网站后端服务器那些事(2016-04-10) 教你成为全栈工程师(Full Stac

杭州专业的软装设计师培训机构教您怎样成为谈单高手

跟客户谈图纸时是否应该有前后步骤,应该怎样最合理?今天五色光小编教您几招: 当我们第一次接触一个客户,无论我们和他谈什么,房子也好,家具也好,工作也好,我们的目的应该是如何利用第一次短暂的接触尽快的和客户做朋友,在公司强大的声誉和制度的背景下,动用个人的人格魅力去影响客户,和他作朋友,无论客户的个人性格有什么缺陷,我们应该尝试着去喜欢他.因为他是我们的客户,而且世界上也没有完美的人.所以这时候的谈话应该说没有什么步骤,但是进行到谈图纸阶段的接触,的确应该遵循一定的步骤.因为每个方案无论大小,都是

教您选购峰华手持IC卡读写机

教您选购峰华手持IC卡读写机:F8手持IC卡读写机采用32位ARM 9 内核微处理器,具备性能高.成本低.扩展性强等特点:使用Wince操作系统,具备多任务功能,提供了先进的维护和管理功能,极大地提高了应用程序的维护和开发效率,确保应用程序的稳定性.支持读写RFID非接触式IC卡.接触式IC卡.PSAM卡等多种交易卡:支持一维条形码扫描.GPRS以及WIFI选配功能. 一查看配置: 1.处理平台 ARM9处理器.主频最高200MHZ 2.存储器 SDRAM:64MB.NandFlash:64MB