文档章节

struts2增强

CarlDing
 CarlDing
发布于 2016/06/23 15:28
字数 1025
阅读 26
收藏 0

 

 

 

 

 

快速Struts2完整版本

1:创建struts2项目

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>jsp-api</artifactId>

<version>2.2</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>org.apache.struts</groupId>

<artifactId>struts2-core</artifactId>

<version>2.5</version>

</dependency>

()

 

2:在web.xml中配置核心的过虑器

 

<filter>

<filter-name>s2</filter-name>

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

</filter>

<filter-mapping>

<filter-name>s2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

 

 

在s2.3.x版本中

 配置的过虑器: org.apache.struts2.dispatcher.ng.StrutsPreparedAndExecutionFilter

在s2.5版本中配置的:

org.apache.struts2.dispatcher.StrutsPreparedAndExecutionFilter

 

 

 

Struts2的执行流程:

   

 

通过上面的问题:

   1:StrutsPreparedAndExecution里面用的是 ThreadLocal模式维护当前线程的对象,同时对requst进行包装,即包装模式。

   2:ActionInvocation是迭代器模式。actionInvocation.invoke()是指执行一下拦截器,如果没有则直接执行目标资源。

 

 

3:添加struts2的配置文件

 

 

4:添加一个登录的action

以下包含三个问题:

   1:如何开发一个action

   2:如何来接收参数:属性,模型。

   3:如何访问域对象。

   4:可以在execute中来返回多个字符串。根据不同的字符串,返回不同的地址

 

接收用户名+密码,如果用户成功,就去显示工作平台:

 

   package cn.s2.login;

 

import org.apache.commons.lang3.StringUtils;

 

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;

 

import cn.s2.domain.User;

 

public class LoginAction extends ActionSupport implements ModelDriven<User> {

private User user = new User();

 

@Override

public User getModel() {

return user;

}

 

@Override

public String execute() throws Exception {

// 如果用户和密码密码有顺序正好相反则登录成功

String pwd = StringUtils.reverse(user.getPwd());

if (user.getName().equals(pwd)) {

//如果登录成功,则应该将用户的信息保存到Session

ActionContext.getContext().getSession().put("user",user);

return SUCCESS;

} else {

ActionContext.getContext().getSession().put("error", "用户名或密码错误");

return INPUT;

}

}

}

 

配置:

 

 

 

 

对于OGNL来说:

  如果直接写入值:<s:if test=name/>  相当于是从Stack取值。

   如果以#开始,则是找取上下文中的值  <s:if test=#session.name> 相当于从map.get(session).getAttribute(name)

 

<form action="<s:url value='/login.action'/>" method="post">

<s:if test="#session.error!=null">

<s:property value="#session.error"/>

</s:if>

Name:<input type="text" name="name" value="${name}"><br>

Pwd:<input type="text" name="pwd"><br>

<input type="submit">

</form>

 

 

 

 

5:退出

使用同一个Action即可

 

public String logout() {

ActionContext.getContext().getSession().remove("user");

return INPUT;

}

 

 

配置动态的方法调用:

<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

<package name="s2" extends="struts-default" strict-method-invocation="false">

<action name="login" class="cn.s2.login.LoginAction">

<result>/WEB-INF/views/index.jsp</result>

<result name="input">/index.jsp</result>

</action>

</package>

 

 

 

 

 

6:在登录成功以后,要求可以显示所有学生名单

 

显示的学生名单功能,应该是一个Servlet开发的

 

 

所使用的技术:jquery-databales -

   要求的数据是:[

{},{},{},{}

]

 

在struts2里面如何返回json:

  

实现的方式:

  1:可以返回一个一个统一的页面上去,如
    <global-results>

       <result name=json>/WEB-INF/views/pubs/json.jsp</result>  在json.jsp中:${json}

    </global-results>

 

在action中必须要:

   Public String queryStuds(){

List<Stud> list =service.query();

String json = JSONArray.toJsonString(list);

ActionContext.getContext().put(json,json);

   Return json;

   }

 

2:自己开发Result从栈顶来获取数据

 

3:使用json插件,自动从栈顶获取数据

<!-- http://mvnrepository.com/artifact/org.apache.struts/struts2-json-plugin -->

<dependency>

    <groupId>org.apache.struts</groupId>

    <artifactId>struts2-json-plugin</artifactId>

    <version>2.5</version>

</dependency>

 

 

public class StudAction extends ActionSupport {

 

@Override

public String execute() throws Exception {

Random r = new Random();

int ran = r.nextInt(300);

List<Stud> list = new ArrayList<>();

for (int i = 0; i < ran; i++) {

list.add(new Stud(UUID.randomUUID().toString().replace("-", "").substring(0, 10), r.nextInt(100),

"189" + r.nextInt(1000), UUID.randomUUID().toString().replace("-", "")));

}

///////////////////////

ActionContext.getContext().getValueStack().push(list);

return SUCCESS;

}

}

 

<action name="stud" class="cn.s2.stud.StudAction">

<result type="json"/>

</action>

 

7:问题

不安全

没有登录也可以查看所有学生信息:

 

 

 

解决方案:

   使用拦截器拦截所有安全的Action

package cn.s2.interceptor;

 

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

 

import cn.s2.domain.User;

 

public class LoginInterceptor extends AbstractInterceptor {

 

@Override

public String intercept(ActionInvocation invocation) throws Exception {

// 判断用户是否登录

User user = (User) ActionContext.getContext().getSession().get("user");

if (user == null) {

ActionContext.getContext().put("error", "请先登录!");

return "input";

} else {

return invocation.invoke();

}

}

 

}

 

<interceptors>

<interceptor name="loginInterceptor" class="cn.s2.interceptor.LoginInterceptor"></interceptor>

<interceptor-stack name="secuDefaultStack">

<interceptor-ref name="defaultStack"></interceptor-ref>

<interceptor-ref name="loginInterceptor"></interceptor-ref>

</interceptor-stack>

</interceptors>

<default-interceptor-ref name="secuDefaultStack"></default-interceptor-ref>

 

 

 

 

8: 验证码

可以使用自定义的reuslt来实现:

public class ImgResult implements Result {

@Override

public void execute(ActionInvocation invocation) throws Exception {

 

<!-- 配置自定义的result -->

<result-types>

<result-type name="img" class="cn.s2.results.ImgResult"></result-type>

</result-types>

 

<!-- 开发一个action自动返回这个result -->

<action name="image">

<result name="img"></result>

</action>

 

<!-- 配置自定义的result -->

<result-types>

<result-type name="img" class="cn.s2.results.ImgResult">

<param name="width">90</param>

<param name="num">6</param>

</result-type>

</result-types>

 

<!-- 开发一个action自动返回这个result -->

<action name="image">

<result type="img">

<param name="width">120</param>

<param name="num">8</param>

</result>

</action>

 

 

 

© 著作权归作者所有

上一篇: struts2-validate
下一篇: struts2初步2
CarlDing
粉丝 5
博文 106
码字总数 78103
作品 0
济南
其他
私信 提问
Beangle 2.4.0 发布

Beangle 2.4.0 提供了程序开发新的特性,并修复了2.3.0 遗留的错误,主要有: Beangle-Struts2-View修复了中脚本错误和标签缺陷 Beangle-Struts2-View增加了新的服务端标签 Beangle-Security...

段体华
2011/06/27
530
0
Uploadify——学习(1):在Struts2的使用

Uploadify是一个基于Jquery的文件上传组件,官网http://www.uploadify.com/可以在官网获得该组件,运行演示示例,下载帮助文档。 作为Web前端的增强技术,Jquery给用户以更好的体验和交互,增...

凡尘里的一根葱
2015/09/12
17
0
MyEclipse 8.0 GA 发布

MyEclipse是一个十分优秀的用于开发Java, J2EE的Eclipse插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开元产品的支持十分不错。MyEclipse目前支持Java Servlet,AJAX, JS...

movedo
2009/11/26
4.3K
11
关于大学计算机毕业后找编程开发工作?

我在大专,学的是计算机专业,出来实习有一年多了吧,马上就要毕业了,跟实习公司的合同也到期了,做是java开发,因为在学校的时候自学了hibernate和struts2,所以到了公司没多长时间就开始参...

小肚子A
2014/05/23
404
2
Java Web学习计划

--- 本月为入门阶段,从零开始,一步一步的做出一个实用的网站。 深入学习Java语言,初步掌握前端技术,使用JSP和MySQL完成一个简单的网站 第1周 Java高级编程学习目标:
1.深入了解JDK环境...

SVD
2016/12/01
167
0

没有更多内容

加载失败,请刷新页面

加载更多

1、Docker学习,第一天

Docker学习,第一天 一、Docker简介 环境配置如此之麻烦,换台机器,重来一次,费事费力。安装的时候,把原始环境一模一样的复制过来。开发人员利用Docker可以消除写作编码时,”在我的机器上...

有一个小阿飞
13分钟前
3
0
10.23

一、编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时间。使用#define或const创建一个表示60的符号常量或const变量。通过while循环让用户重复输入值,直到用户输入小于或等于0...

197王彧涛
39分钟前
3
0
手机视频如何制作GIF动图

很多小伙伴都喜欢用GIF动图在各大社交软件上与好友斗图,那你知道这些好玩有趣的GIF动图是如何制作的吗?下面教你一个将手机视频制作成GIF动图的方法,让你都可以随时随地制作有趣的表情包,...

白米稀饭2019
44分钟前
5
0
Spring Security 实战干货:实现自定义退出登录

1. 前言 上一篇对 Spring Security 所有内置的 Filter 进行了介绍。今天我们来实战如何安全退出应用程序。 2. 我们使用 Spring Security 登录后都做了什么 这个问题我们必须搞清楚!一般登录...

码农小胖哥
今天
10
0
JVM核心知识-类加载机制

JVM中类的生命周期包括7个阶段,加载、准备、验证、解析、初始化、使用、卸载。其中准备、验证、解析被归为连接阶段。 加载 jvm在这个阶段完成的工作 通过类名获取类的二进制字节流 将这个字...

moon888
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部