实例1:实现客户端IP地址和访问方式输出到浏览器。

IpAction.java

package com.amos.web.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /**
* @ClassName: IpAction
* @Description: TODO
* @author: amosli
* @email:amosli@infomorrow.com
* @date Jan 5, 2014 4:22:06 PM
*/
public class IpAction extends ActionSupport {
private static final long serialVersionUID = -5488264951167516910L; public String execute() throws Exception {
// 获取HttpServletRequest对象和HttpServletResponse对象
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
// 获取客户端ip地址
String clientIP = request.getRemoteAddr();
// 取得客户端的访问方式
String method = request.getMethod();
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("客户端访问的IP为:" + clientIP + "<br>");
response.getWriter().write("客户端的访问方式为:" + method);
return null;
}
}

ip_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>
<package name="ip" namespace="/" extends="struts-default">
<action name="IpAction" class="com.amos.web.action.IpAction"
method="execute"></action>
</package>
</struts>

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>
<!-- 加载其他配置文件 -->
<include file="config/ip_struts.xml"></include>
</struts>

配置完成,部署运行,查看输出。

输出结果截图: 

代码分析:

IpAction.java

struts2提供了使用ServletActionContext封装了常用的request和response对象,这里

>>1、使用ServletActionContext.getRequest()获取request对象,

>>2、ServletActionContext.getResponse()获得response对象。

>>3、使用request.getRemoteAddr()方法获取访问端的ip地址;

>>4、request.getMethod()方法获取客户端访问的方式;

ip_struts.xml 

包名必须唯一,namespace可以省略,result属性这里没有用到,因为IpAction中return null,如果retrun "string" ,则必须配置result;

struts.xml

这里不需要配置其他的,只需要引入ip_struts.xml文件即可,使用include引入,引入的地址为相对路径,是否引入成功,查看tomcat启动时的提示信息,或者ctrl点击路径看能不能访问。

实例2:将实例1中的信息通过jsp输出

方法一:

 IpAction.java

package com.amos.web.action;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
* @ClassName: IpAction
* @Description: TODO
* @author: amosli
* @email:amosli@infomorrow.com
* @date Jan 5, 2014 4:22:06 PM
*/
public class IpAction extends ActionSupport {
private static final long serialVersionUID = -5488264951167516910L;
public String execute() throws Exception {
// 获取HttpServletRequest对象和HttpServletResponse对象
HttpServletRequest request = ServletActionContext.getRequest();
// HttpServletResponse response = ServletActionContext.getResponse();
// 获取客户端ip地址
String clientIP = request.getRemoteAddr();
// 取得客户端的访问方式
String method = request.getMethod();
// response.setContentType("text/html;charset=utf-8");
// response.getWriter().write("客户端访问的IP为:" + clientIP + "<br>");
// response.getWriter().write("客户端的访问方式为:" + method);
request.setAttribute("clientIP", clientIP);
request.setAttribute("method", method);
System.out.println("method:"+method);
return "toJSP";
}
}

ip_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>
<package name="ip" namespace="/" extends="struts-default">
<action name="IpAction" class="com.amos.web.action.IpAction"
method="execute">
<result name="toJSP" type="dispatcher">
/ip.jsp
</result>
</action>
</package>
</struts>

ip.jsp是放在webapp目录下的

<%@page import="java.util.Date"%>
<%@ 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>Insert title here</title>
</head>
<body>
<%
String method=request.getAttribute("method").toString();
String clientIP=request.getAttribute("clientIP").toString();
%>
客户端IP是:<%=clientIP %><br/>
客户端的访问方式为:<%=method %><br><hr>
客户端访问的IP为:${requestScope.clientIP }<br>
客户端的访问方式为:${requestScope.method}<br>
</body>
</html>

输出结果截图: 

代码分析:

  IpAction.java中使用request对象的setAttribute方法传值到request域中。如下所示:

request.setAttribute("clientIP", clientIP);
request.setAttribute("method", method);

并且return “toJSP”,不再局限于"success",其实只要ip_struts.xml中result中name属性值与其对应也就ok了。

ip_struts.xml 中使用转发默认方式(转发),name的属性值为"toJSP"与  IpAction.java中execute方法返回值相对应。然后将值转发到ip.jsp里

 <result name="toJSP" type="dispatcher">
/ip.jsp
</result>

ip.jsp中采用了两种取值方式,第一种是基础的传值方式,传值是成功的,另外一种是简写的,一种都没成功,这里先帖出来,以后再慢慢研究吧。

TODO:servlet和jsp 的传值问题。

使用request对象的getAttribute方法来取值,然后再使用jsp的基本输出方式将值输出。

servlet有三个域对象:HttpServletRequest、ServletContext、HttpSession

方法二:

使用ServletContext如何进行传值呢?如下所示,IpAction类中的execute方法改写为:

      // 获取HttpServletRequest对象和HttpServletResponse对象
HttpServletRequest request = ServletActionContext.getRequest();
// 获取servletcontext域
ServletContext servletContext = ServletActionContext.getServletContext();
      // 获取客户端ip地址
String clientIP = request.getRemoteAddr();
// 取得客户端的访问方式
String method = request.getMethod(); // 将信息绑定到servletContext中
servletContext.setAttribute("clientIP", clientIP);
  servletContext.setAttribute("method", method);
return "toJSP";

ip.jsp改写为:

    <%
String method=application.getAttribute("method").toString();
String clientIP=application.getAttribute("clientIP").toString();
%>
客户端IP是:<%=clientIP %><br/>
客户端的访问方式为:<%=method %><br><hr>
[客户端访问的IP为]:${applicationScope.clientIP }<br>
[客户端的访问方式为]:${applicationScope.method}<br>

输出结果为:

 方法三(重点):

Ip_Action.java 中execute方法需要改的地方:

        //获取HttpSession域 
Map<String, Object> session = ActionContext.getContext().getSession();
//将信息绑定到servletSession中
session.put("clientIP", clientIP);
session.put("method", method);

ip.jsp中需要改动的地方:

        <%
String method=session.getAttribute("method").toString();
String clientIP=session.getAttribute("clientIP").toString();
%>
客户端IP是:<%=clientIP %><br/>
客户端的访问方式为:<%=method %><br><hr>
[[客户端访问的IP为]]:${sessionScope.clientIP }<br>
[[客户端的访问方式为]]:${sessionScope.method}<br>

这里使用ActionContext获取session对象,再用getAttribute方法获取传过来的值。

输出结果为:

 为什么ActionContext.getContext().getSession()会是Map集合?

struts2中有很多个默认拦截器(interceptor),在struts2源码中struts-default.xml中可以查看具体有哪些拦截器。interceptor-stack中有18个拦截器。

其中有一个拦截器将map中的值转为session值,例如,String method=map.get("method");HttpSession.setAttribute("method",method)

自动将map中的值转为session,这样做的目的是尽量少出现或者不出现ServletAPI,以达到解耦的作用。

java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器的更多相关文章

  1. java struts2入门学习实例--用户注册

     一.用户注册示例 register.jsp <%@ page language="java" contentType="text/html; charset=UT ...

  2. java struts2入门学习实例--使用struts2快速实现上传

    一.文件上传快速入门 1).关于上传表单三要素 >>尽量以POST请求方式上传,因为GET支持文件大小是有限制的. >>必须要加上enctype="multipart ...

  3. java struts2入门学习实例--使用struts进行验证

    一.为什么要进行验证? 验证几乎是注册登录的必须前提,验证的主要作用有两点: 1.安全性 2.对用户提供差异化服务. 二.如何验证? ActionSupport类中有一个validate()方法,这是 ...

  4. java struts2入门学习实例--使用struts2快速实现多个文件上传

    一.错误提示信息配置 昨天说到更改默认错误配置信息,我测试很多遍,一直都不对.下面贴出来,待以后有好方法了再补充吧. 首先新建一个properties文件,这里命名为testupload.proper ...

  5. java struts2入门学习实例--用户注册和用户登录整合

    需求: 1.用户注册(user_register.jsp)-->注册成功(UserRegister.action)-->显示注册信息(register_success.jsp)2.用户登录 ...

  6. java struts2入门学习---中文验证、对错误消息的分离、结果(result)类型细节配置

    一.需求 利用struts2实现中文验证并对错误消息的抽离. 详细需求:用户登录-->不填写用户名-->页面跳转到用户登录页面,提示用户名必填(以英文和中文两种方式提示)-->填写英 ...

  7. java struts2入门学习---国际化

    一.国际化的概念 1.不同国家的人访问同一个网站,显示的语言不同. 2.对JSP页面进行国际化 属性(properties)文件命名规则:基名---语言--国家如, message_zh_CN.pro ...

  8. java struts2入门学习--OGNL语言常用符号和常用标签学习

    一.OGNL常用符号(接上一篇文章): 1.#号 1)<s:property value="#request.username"/> 作用于struts2的域对象,而不 ...

  9. java struts2入门学习--OGNL语言基本用法

    一.知识点学习 1.struts2中包含以下6种对象,requestMap,sessionMap,applicationMap,paramtersMap,attr,valueStack; 1)requ ...

随机推荐

  1. 原生javascript实现异步的7种方式

    1.$(document).ready 点评: 需要引用jquery :兼容所有浏览器. 2.标签的async=”async”属性 async的定义和用法(是HTML5的属性) async 属性规定一 ...

  2. 揭秘uc浏览器三

    这节我们主要讨论收藏与历史记录页面的边边角角. 首先,看看他的最终的效果图了: 照例了,我们先看看他的布局文件: <!-- tab布局文件 --> <TabHost xmlns:an ...

  3. walmart weekly sales

    最近参加了kaggle的walmart weekly sales 预测比赛,已经过期但还能提交获得评分.Walmart Recruiting - Store Sales Forecasting 提供的 ...

  4. Centos下配置单元测试工具gtest

    gtest是google提供的一个非常强大的单元测试工具,下载地址:https://code.google.com/p/googletest 我下载的是gtest-1.6.0.拷贝到Centos系统上 ...

  5. php命名空间的使用,同一个命名空间可以在多个文件中定义

    php namespace的使用,直接打印出已经定义的命名空间 直接上代码,a.php , b.php, c.php , main.php a.php <?php namespace A{ cl ...

  6. [Git] Undo my last commit and split it into two separate ones

    When you accidentally committed some changes to your branch you have various possibilities to “undo” ...

  7. 论文阅读:Memory Networks

    一.论文所解决的问题 实现长期记忆(大量的记忆),而且实现怎样从长期记忆中读取和写入,此外还增加了推理功能 为什么长期记忆非常重要:由于传统的RNN连复制任务都不行,LSTM预计也够玄乎. 在QA问题 ...

  8. OpenGL ES 3.0之顶点缓冲

    所谓顶点缓冲就是直接将顶点数据存储在gpu的一段缓冲区,不需要从cpu拷贝到gpu.提高了程序的运行效率. 操作步骤 1.创建顶点缓冲对象 GLuint vertexBufferID; 2.分配空间 ...

  9. JavaScript 从闭包可以做什么开始,将有助于理解闭包

    本文内容 函数内部访问全局变量 函数外部不能直接访问局部变量 函数外部访问局部变量 保护私有成员 持久性 模块化 抽象性 闭包是 JavaScript 的重要特性,非常强大,可用于执行复杂的计算,可并 ...

  10. MyBatis - (一) 基本数据操作命令和简单映射

    1. 简单的select映射 <mapper namespace="com.mybatis3.mappers.StudentMapper"> <select id ...