PostgreSql 安装配置 PostGIS

1.安装PostGIS插件

sudo apt-get install PostGIS
sudo apt-get install postgresql-9.3-postgis

2.开启PostgreSql对于PostGIS 的支持,在psql 或者 PgAdmin 中执行命令

-- Enable PostGIS (includes raster)
CREATE EXTENSION postgis;
-- Enable Topology
CREATE EXTENSION postgis_topology;
-- fuzzy matching needed for Tiger
CREATE EXTENSION fuzzystrmatch;
-- Enable US Tiger Geocoder
CREATE EXTENSION postgis_tiger_geocoder;

3.测试例子

-- Create table with spatial column
CREATE TABLE mytable ( 
  id SERIAL PRIMARY KEY,
  geom GEOMETRY(Point, 26910),
  name VARCHAR(128)
); 

-- Add a spatial index
CREATE INDEX mytable_gix
  ON mytable 
  USING GIST (geom); 

-- Add a point
INSERT INTO mytable (geom) VALUES (
  ST_GeomFromText('POINT(0 0)', 26910)
);

-- Query for nearby points
SELECT id, name
FROM mytable
WHERE ST_DWithin(
  geom, 
  ST_GeomFromText('POINT(0 0)', 26910),
  1000
);

PostGIS 快速入门

PostGIS 是 PostgreSQL 关系数据库的空间操作扩展。它为 PostgreSQL 提供了存储、查询和修改空间关系的能力。本文中 ‘PostgreSQL’ 指代基本的关系数据库功能,而 ‘PostGIS’ 指代扩展的空间操作特性。

  • 客户端-服务器构架

PostgreSQL 同众多数据库产品一样,采用客户端-服务器构架。客户端向服务器发出请求并得到响应。这种机制同浏览器从网络服务器获取网页类似。在 PostgreSQL 中,请求以 SQL 语言发出,而响应多为从数据库提取的表单。

客户端与服务器可以部署在同一台设备上,即 PostgreSQL 可以在单一的计算机上使用。借由系统内部的 ‘loopback’ 通信机制,数据库系统可以进行私密通讯。除非专门配置,外界是不能访问这些信息的。

本位介绍三种客户端:命令行, Quantum GISpgAdmin 图形化数据库客户端。

  • 创造具有空间信息处理能力的数据库

命令行客户端在终端模拟器(Terminal Emulator)中运行。在 Applications 菜单的 Accessories 中打开一个终端模拟器,将显示一个 Unix 风格的命令行界面。输入:

psql -V

回车确认,将显示 PostgreSQL 版本号。

一个 PostgreSQL 服务器中,可以将不同的任务组织到不同的数据库。每个数据库独立运作,拥有专门的表单、显示、用户等。访问 PostgreSQL 数据库时将指定一个数据库。

服务器上数据库列表通过以下命令查询:

psql -l

输出将罗列 Live 上配置的几个数据库。这里演示新建一个。

PostgreSQL 使用 createdb 工具创建数据库。这里建立的数据库应带有 PostGIS 的扩展功能,因此需要指定相应的模板。这里将新建数据库称为 demo 。命令为:

createdb -T template_postgis demo

现在执行 psql -l 应当可以看到 demo 数据库。

也可以使用 SQL 语言创建 PostGIS 数据库。首先使用 dropdb 命令删除之前创建的数据库,然后使用 psql 命令开启 SQL 命令解析器:

dropdb demo
psql -d postgres

这样就连接到了一个通用的系统数据库 postgres 。输入 SQL 命令建立新数据库:

postgres=# CREATE DATABASE demo TEMPLATE=template_postgis;

现在可以转换连接到新建的数据库。若重新连接时可以使用 psql -d demo 命令。但在 psql 系统内部也可以使用以下命令:

postgres=# \c demo

一个信息页面将显示当前已连接 demo 数据库。输入 \dt 列出当前数据库内的表单,输出如下:

demo=# \dt
             List of relations
 Schema |       Name       | Type  | Owner
--------+------------------+-------+-------
 public | geometry_columns | table | user
 public | spatial_ref_sys  | table | user
(2 rows)

这两个表格是 PostGIS 默认的。其中 spatial_ref_sys 存储着合法的空间坐标系统。利用 SQL 查询查看:

demo=# SELECT srid,auth_name,proj4text FROM spatial_ref_sys LIMIT 10;

 srid | auth_name |          proj4text
------+-----------+--------------------------------------
 3819 | EPSG      | +proj=longlat +ellps=bessel +towgs...
 3821 | EPSG      | +proj=longlat +ellps=aust_SA +no_d...
 3824 | EPSG      | +proj=longlat +ellps=GRS80 +towgs8...
 3889 | EPSG      | +proj=longlat +ellps=GRS80 +towgs8...
 3906 | EPSG      | +proj=longlat +ellps=bessel +no_de...
 4001 | EPSG      | +proj=longlat +ellps=airy +no_defs...
 4002 | EPSG      | +proj=longlat +a=6377340.189 +b=63...
 4003 | EPSG      | +proj=longlat +ellps=aust_SA +no_d...
 4004 | EPSG      | +proj=longlat +ellps=bessel +no_de...
 4005 | EPSG      | +proj=longlat +a=6377492.018 +b=63...
(10 rows)

以上显示确认了该数据库已经建立空间操作功能。数据库中的 geometry_columns 用于记录那些表格是有空间信息的。

  • 手工建立空间数据表格

空间数据库已经建立,现在可以建立具有空间信息的表格。

首先建立一个常规的表格存储有关城市(cities)的信息。这个表格有两栏,一个是 ID 编号,一个是城市名:

demo=# CREATE TABLE cities ( id int4, name varchar(50) );

现在添加一个空间栏用于存储城市的位置。习惯上这个栏目叫做 the_geom 。它记录了数据为什么类型(点、线、面)、有几维(这里是二维)以及空间坐标系统。此处使用 EPSG:4326 坐标系统:

demo=# SELECT AddGeometryColumn ('cities', 'the_geom', 4326, 'POINT', 2);

完成后,查询 cities 表单应当显示这个新栏目。同时页面将显示当前表达没有记录(0 rows)。

demo=# SELECT * from cities;
 id | name | the_geom
----+------+----------
(0 rows)

为添加记录,需要使用 SQL 命令。对于空间栏,使用 PostGIS 的 ST_GeomFromText 可以将文本转化为坐标与参考系号的记录:

demo=# INSERT INTO cities (id, the_geom, name) VALUES (1,ST_GeomFromText('POINT(-0.1257 51.508)',4326),'London, England');
demo=# INSERT INTO cities (id, the_geom, name) VALUES (2,ST_GeomFromText('POINT(-81.233 42.983)',4326),'London, Ontario');
demo=# INSERT INTO cities (id, the_geom, name) VALUES (3,ST_GeomFromText('POINT(27.91162491 -33.01529)',4326),'East London,SA');

当然,这样的输入方式难以操作。其它方式可以更快的输入数据。就目前来说,表格内已经有了一些城市数据,可以先进行查询等操作。

  • 简单查询

标准的 SQL 操作都可以用于 PostGIS 表单:

demo=# SELECT * FROM cities;
 id |      name       |                      the_geom
----+-----------------+----------------------------------------------------
  1 | London, England | 0101000020E6100000BBB88D06F016C0BF1B2FDD2406C14940
  2 | London, Ontario | 0101000020E6100000F4FDD478E94E54C0E7FBA9F1D27D4540
  3 | East London,SA  | 0101000020E610000040AB064060E93B4059FAD005F58140C0
(3 rows)

这里的坐标是无法阅读的 16 进制格式。要以 WKT 文本显示,使用 ST_AsText(the_geom) 或 ST_AsEwkt(the_geom) 函数。也可以使用 ST_X(the_geom) 和 ST_Y(the_geom) 显示一个维度的坐标:

demo=# SELECT id, ST_AsText(the_geom), ST_AsEwkt(the_geom), ST_X(the_geom), ST_Y(the_geom) FROM cities;
 id |          st_astext           |               st_asewkt                |    st_x     |   st_y
----+------------------------------+----------------------------------------+-------------+-----------
  1 | POINT(-0.1257 51.508)        | SRID=4326;POINT(-0.1257 51.508)        |     -0.1257 |    51.508
  2 | POINT(-81.233 42.983)        | SRID=4326;POINT(-81.233 42.983)        |     -81.233 |    42.983
  3 | POINT(27.91162491 -33.01529) | SRID=4326;POINT(27.91162491 -33.01529) | 27.91162491 | -33.01529
(3 rows)
  • 空间查询:

PostGIS 为 PostgreSQL 扩展了许多空间操作功能。以上已经涉及了转换空间坐标格式的 ST_GeomFromText 。多数空间操作以 ST(spatial type)开头,在 PostGIS 文档相应章节有罗列。这里回答一个具体的问题:以米为单位并假设地球是完美椭球,上面三个城市相互的距离是多少?

demo=# SELECT p1.name,p2.name,ST_Distance_Sphere(p1.the_geom,p2.the_geom) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
      name       |      name       | st_distance_sphere
-----------------+-----------------+--------------------
 London, Ontario | London, England |   5875766.85191657
 East London,SA  | London, England |   9789646.96784908
 East London,SA  | London, Ontario |   13892160.9525778
 (3 rows)

输出显示了距离数据。注意 ‘WHERE’ 部分防止了输出城市到自身的距离(0)或者两个城市不同排列的距离数据(London, England 到 London, Ontario 和 London, Ontario 到 London, England 的距离是一样的)。尝试取消 ‘WHERE’ 并查看结果。

这里采取不同的椭球参数(椭球体名、半主轴长、扁率)计算:

demo=# SELECT p1.name,p2.name,ST_Distance_Spheroid(
        p1.the_geom,p2.the_geom, 'SPHEROID["GRS_1980",6378137,298.257222]'
        )
       FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
      name       |      name       | st_distance_spheroid
-----------------+-----------------+----------------------
 London, Ontario | London, England |     5892413.63776489
 East London,SA  | London, England |     9756842.65711931
 East London,SA  | London, Ontario |     13884149.4140698
(3 rows)
  • 制图

以 PostGIS 数据制图需要相应的客户端支持。包括 Quantum GIS、gvSIG、uDig 在内的多种客户端均可以。以下使用 Quantum GIS:

从 Desktop GIS 菜单启动 Quantum GIS 并在其 layer 菜单选择 Add PostGIS layers 。连接到 Natural Earth PostGIS 数据库的参数在 Connections 下拉菜单中有。这里可以定义和储存其它的配置。点击 Edit 可以查看具体参数。点击 Connect 连接:

postgis_addlayers  系统将显示所有空间信息表供选择:

postgis_listtables  选择 lakes 湖泊表单并点击底部的 Add 添加。顶部的 Load 可以载入新的数据库连接配置。数据将被导入:

postgis_lakesmap  界面上显示出湖泊的分布。QGIS 并不理解湖泊一词的含义,也许不会自动使用蓝色。请查看其手册了解如何设置。这里缩放到加拿大一处著名的湖泊群。

  • 自动创建空间数据表单

OSGeo Live 的多数桌面 GIS 系统都可以将 shp 等文件导入数据库。这里依然使用 QGIS 演示。

QGIS 中导入 shp 可以使用 PostGIS Manager 插件。在 Plugins 菜单选择 Fetch Plugins 导入最新的官方插件列表(需要网络连接)。找到 PostGIS Manager 点击 Install plugin 安装。

postgis_getmanager  完成后,在 Plugin 菜单点击 PostGIS Manager 启动。也可以点击工具栏上大象与地球的图标。

该插件将连接 Natural Earth 数据库。若提示输入密码,留空即可。在开启的界面中,选择表单可以显示相应的信息。预览(Preview)选项卡可以显示地图预览。这里选择了 populated places 图层并缩放到一个小岛:

postgis_managerpreview  接下来使用 PostGIS Manager 将 shp 导入数据库。这里使用 R 统计扩展包含的 North Carolina sudden infant death syndrome (SIDS) 数据:

Data 菜单选择 Load data from shapefile 选项。点击 ... 选中 R maptools 中的 sids.shp

postgis_browsedata  直接点击 Load 即可:

postgis_importsids

数据将被导入 PostGIS 。关闭 PostGIS Manager 回到主界面。

使用 ‘Add PostGIS Layer’ 导入 SIDS 数据。略加调整,得到被卡洛莱娜州新生儿猝死率分布图:

postgis_sidsmap

  • pgAdmin III

通过 Databases 菜单下的 pgAdmin III 可以进行非空间操作。该客户端是 PostgreSQL 的官方产品,使用 SQL 语句操作。

postgis_adminscreen1 postgis_adminscreen2

进一步尝试

可以尝试其它一些操作:

  1. 尝试 st_buffer(the_geom)st_transform(the_geom,25831)x(the_geom) 等空间操作,相关文档位于 http://postgis.org/documentation/
  2. 在命令行使用 pgsql2shp 将表单导出到 shp 。
  3. 在命令行使用 ogr2ogr 导入导出数据。

其它信息

以下网站包含了有关 PostGIS 的大量信息:

PostGIS 主页

PostGIS 文档

Ubuntu 13.10 PostgreSQL 9.3 快速入门

  • 启动
sudo /etc/init.d/postgresql start
  • 停止
sudo /etc/init.d/postgresql stop
  • 设置密码

安装完毕,我们需要更改postgres用户的密码,否则我们就没法使用这个数据库服务器。以postgres这个系统用户的身份运行psql命令,在终端中输入如下:

sudo su postgres -c psql template1

这时候会出现新的提示符,输入下面两个命令,用新密码替换 <***password***>:

ALTER USER postgres WITH PASSWORD ' <***password***> ';
  • 设置 postgres 用户的密码
sudo passwd postgres

而后输入自己的密码

  • 创建数据库

创建第一个数据库,我们把它命名为"mydb",先输入:

su postgres

转为 postgres 用户登陆后,执行

createdb mydb
  • 使用pgAdmin III图形界面客户端

要了解PostgreSQL能干些什么,你首先要学会使用一个图形界面的客户端,在终端中输入:

pgadmin3

你现在停留在pgAdmin III的主界面,点击 "添加数据库连接" 按钮(在左上方)。弹出一个新的对话框,输入地址127.0.0.1,服务器描述,默认数据库"mydb" 和你的密码。

注意,如果pgadmin3报告

“发生了一个错误:
Error connecting to the server: 无法联接到服务器: 连接被拒绝
服务器是否在主机 "127.0.0.1" 上运行并且准备接受在端口
5432 上的 TCP/IP 联接?”

则原因为

原来postgres8.4.4之后的版本的监听端口竟然改为5433了,而pgadmin中默认端口还是5432

通过这个图形界面,你可以新建数据库,表和其他对象;查询数据库,添加数据,执行SQL语句等。 用pgAdmin 3连接

500px-Pgadminpostgresql

  • 管理用户和权限

PostgreSQL没有一个简单的管理用户的方法 ,首先你必需编辑/etc/postgres/pg_hba.conf 并修改它的默认配置(默认配置的安全性非常高),你希望 postgres 来管理它的用户(和系统用户无关),你需要添加如下几行:

<-------------------------------------------
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
# rezo local
host all all 10.0.0.0 255.255.255.0 password
<-------------------------------------------

它的意思是通过你的本地网络(10.0.0.0/24要替换为你的本地网络 !), postgres用户可以以传统的”用户名+密码“的方式连接到数据库。

创建一个数据库,并创建一个对该数据库拥有所有权限的用户,可以使用如下命令:

sudo su postgres -c createuser -D -A -P myuser
sudo su postgres -c createdb -O myuser mydb

第一个命令是创建一个新用户,这个用户没有创建数据库的权限(-D),没有新建用户的权限(-A)。创建用户时会提示你输入密码。第二个命令是创建一个数据库'mydb ,以 'myuser' 作为它的所有者。

Ubuntu 13.10 安装 PostgreSql 9.3

PostgreSql 9.3 增加了物化视图功能,但是Ubuntu自带的更新源只提供了 9.1 版本,去PostgreSql 官网看了一下,发现他们对于Ubuntu 只支持LTS版本,对于PPA软件源是不能自动安装的。

但是在http://wiki.postgresql.org/wiki/Apt 中提供了对于其他版本的手动配置功能

1.创建PPA文件

sudo vim /etc/apt/sources.list.d/pitti-postgresql-saucy.list

在vim 窗口中输入

deb http://apt.postgresql.org/pub/repos/apt/ squeeze-pgdg main

2.手动装证书,如果不安装,会提示 “由于没有公钥,无法验证下列签名:NO_PUBKEY  ...”

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

3.命令行安装

sudo apt-get update
sudo apt-get install postgresql-9.3 pgadmin3

4.安装插件支持,否则创建插件支持时候会报告

ERROR:  could not open extension control file "/usr/share/postgresql/9.3/extension/tablefunc.control": No such file or directory

安装命令

sudo apt-get install postgresql-contrib

5.安装 PostGIS

sudo apt-get install PostGIS

WordPress官方友情链接插件:Link Manager

WordPress官方从WordPress 3.5版本之后,把友情链接功能从核心从核心功能中删除了,这给升级的用户造成了困扰,在WordPress 3.5正式版发布之后,官方也第一时间推荐了一款友情链接插件:Link Manager。

插件使用非常简单,直接安装即可,在插件管理器中查找即可安装,使用这款插件之后,WordPress的友情链接功能又和之前一样了。

Mac OS X 10.9 使用 Hardware Accelerated Execution 之后死机问题

为了加速电脑上面的Android  模拟器,可以使用Intel Atom 模拟器,但是在升级到10.9 之后发生死机问题,开启到一半,电脑整个卡住。搜索了一下,需要到intel 下载针对 10.9 的补丁版本

下载地址为

http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager/

屏幕快照 2013-11-27 上午11.58.54注意 下载 Hotfix for OS X 10.9 only

Java程序执行超时——Future接口介绍

在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实 现,可以来进行异步计算。
Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Future 接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品。
Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果,也可以设置任务执行的超时时间。这个设置超时的方法就是实现Java程 序执行超时的关键。
Future接口是一个泛型接口,严格的格式应该是Future,其中V代表了Future执行的任务返回值的类型。 Future接口的方法介绍如下:

  • boolean cancel (boolean mayInterruptIfRunning) 取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束
  • boolean isCancelled () 任务是否已经取消,任务正常完成前将其取消,则返回 true
  • boolean isDone () 任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回true
  • V get () throws InterruptedException, ExecutionException 等待任务执行结束,然后获得V类型的结果。InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException
  • V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计 算超时,将抛出TimeoutException

Future的实现类有java.util.concurrent.FutureTask即 javax.swing.SwingWorker<t,v>。通常使用FutureTask来处理我们的任务。FutureTask类同时又 实现了Runnable接口,所以可以直接提交给Executor执行。使用FutureTask实现超时执行的代码如下:

ExecutorService executor = Executors.newSingleThreadExecutor();
FutureTask<String> future =
       new FutureTask<String>(new Callable<String>() {//使用Callable接口作为构造参数
         public String call() {
           //真正的任务在这里执行,这里的返回值类型为String,可以为任意类型
       }});
executor.execute(future);
//在这里可以做别的任何事情
try {
	result = future.get(5000, TimeUnit.MILLISECONDS); //取得结果,同时设置超时执行时间为5秒。同样可以用future.get(),不设置执行超时时间取得结果
} catch (InterruptedException e) {
	futureTask.cancel(true);
} catch (ExecutionException e) {
	futureTask.cancel(true);
} catch (TimeoutException e) {
	futureTask.cancel(true);
} finally {
	executor.shutdown();
}

不直接构造Future对象,也可以使用ExecutorService.submit方法来获得Future对象,submit方法即支持以 Callable接口类型,也支持Runnable接口作为参数,具有很大的灵活性。使用示例如下:

ExecutorService executor = Executors.newSingleThreadExecutor();
FutureTask<String> future = executor.submit(
   new Callable<String>() {//使用Callable接口作为构造参数
       public String call() {
      //真正的任务在这里执行,这里的返回值类型为String,可以为任意类型
   }});
//在这里可以做别的任何事情
//同上面取得结果的代码

转自 http://westyi.iteye.com/blog/714935

Proguard代码混淆/反混淆简介

  • proguard 原理

Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到。为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆 java 元素名混淆掉。在分析class 的同时,他还有其他两个功能,删除无效代码(Shrinking 收缩),和代码进行优化 (Optimization Options)。
缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。
一, 我们用到反射的地方。
二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。
三, 是我们的 java 元素名称是在配置文件中配置好的。
所以使用proguard时,我们需要有个配置文件告诉 proguard 那些 java 元素是不能混淆的。

继续阅读Proguard代码混淆/反混淆简介

使用Maven构建Struts2项目

1. 新建一个基本的Web项目

这和前面讲的是一样的,可以参考前面的博客

2. 添加Struts2依赖

这里主需要在pom.xml中添加一个struts-core的依赖即可:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.deppon.demo</groupId>
  <artifactId>test02</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>test02 Maven Webapp</name> 
  <url>http://maven.apache.org</url>

  <!-- 属性配置 -->
  <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>  

  	<!-- 添加JUnit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <!-- Struts2 依赖 -->
	<dependency>
		<groupId>org.apache.struts</groupId>
		<artifactId>struts2-core</artifactId>
		<version>2.3.1</version>
	</dependency>

  </dependencies>
  <build>
    <finalName>test02</finalName>
  </build>
</project>

之后,Maven会自动从网上下载struts2需要的其他依赖包,可以看一下这里:

1365857845_8824

3. 新建一个Action

package com.deppon.test02.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
	private static final long serialVersionUID = -1417237614181805435L;

	private String name;
	private String password;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * 跳转到登录界面
	 * @return
	 */
	public String login_input() {
		return SUCCESS;
	}

	/**
	 * 登录
	 * @return
	 */
	public String login() {
		System.out.println("name->" + name);
		System.out.println("password->" + password);

		return SUCCESS;
	}
}

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.i18n.encoding" value="utf-8"></constant>
	<constant name="struts.multipart.maxSize" value="20971520"/>
    <constant name="struts.devMode" value="true" />

	<package name="p_user" namespace="/" extends="struts-default">
		<action name="login_input" class="com.deppon.test02.action.UserAction" method="login_input">
			<result name="success">
				/login.jsp
			</result>
		</action>

		<action name="login" class="com.deppon.test02.action.UserAction" method="login">
			<result name="success">
				/login_success.jsp
			</result>
		</action>
	</package>

</struts>

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

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

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>主页</title>
	</head>

	<body>
		<a href="login_input">去登陆</a>
	</body>
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>登录界面</title>
	</head>

	<body>
		<form action="login" method="post">
			name:<input type="text" name="name" />
			password:<input type="password" name="password" />

			<input type="submit" value="登录" />
		</form>
	</body>
</html>

login_success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>登录成功</title>
	</head>

	<body>
		<s:form action="login" namespace="/" method="post">
			<s:textfield name="name" label="name"></s:textfield>
			<s:password name="password" label="password"></s:password>

			<s:submit value="Login"></s:submit>
		</s:form>
	</body>
</html>

项目结构如下图所示:

1365858256_5114

使用Maven 构建 Servlet的例子

按照前面的 使用Maven构建Web项目 来创建一个Web项目,然后创建下面的例子

1.在src/main/java下,新建一个Servlet

package com.deppon.text01.action;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request , response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");

		String action = request.getParameter("action");
		if("login_input".equals(action)) {
			request.getRequestDispatcher("login.jsp").forward(request , response);
		} else if("login".equals(action)) {
			String name = request.getParameter("name");
			String password = request.getParameter("password");

			System.out.println("name->" + name + ",password->" + password);
		}
	}

}

 

2. 修改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	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_3_0.xsd">

  <servlet>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>com.deppon.text01.action.UserServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/user</url-pattern>
  </servlet-mapping>

</web-app>

3.修改pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.deppon.demo</groupId>
  <artifactId>test01</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>test01 Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <!-- 属性配置 -->
  <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- 依赖配置 -->	  
  <dependencies>
  	<!-- 添加JUnit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <!-- 添加Servlet -->
    <dependency>  
	    <groupId>javax.servlet</groupId>  
	    <artifactId>servlet-api</artifactId>  
	    <version>2.5</version>  
	    <scope>provided</scope>  
    </dependency>  

  </dependencies>

  <build>
    <finalName>test01</finalName>
  </build>

</project>

 

4. 新建JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Hello Maven</title>
	</head>

	<body>
		<p>大家好!</p>
		<a href="user?action=login_input">去登录</a>
	</body>
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>登录界面</title>
	</head>

	<body>
		<form action="user?action=login" method="post">
			Name:<input type="text" name="name" />
			Password:<input type="password" name="password" />

			<input type="submit" value="登录" />
		</form>
	</body>
</html>

 

5. 测试

1365863970_1170

1365863980_8926

1365863994_9037

项目结构如下图所示:

1365864022_9970

参考

http://blog.csdn.net/yuguiyang1990/article/details/8797153