文档章节

struts2初步2

CarlDing
 CarlDing
发布于 2016/06/23 13:47
字数 1026
阅读 47
收藏 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增强
下一篇: Struts2初步
CarlDing
粉丝 5
博文 106
码字总数 78103
作品 0
济南
其他
私信 提问
Java Web学习计划

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

SVD
2016/12/01
164
0
SpringMVC初步学习

①DispatcherServlet(请求分配器,在web.xml中配置) ②HandlerMapping(请求映射器,eg:SimpleUrlHandlerMapping) ③Controller ④ViewResolver(View)(结果视图解析器,eg:UrlBasedVi...

silenceyawen
2016/05/07
53
0
struts2 + freemarker的问题

struts2 做MVC ,freemarker做表现层。 现在我要在页面上做一个简单的下拉框。如果用JSP做表示层,很简单: 但是这条语句,如果用Freemarker做为表示层之后,需要这么写: 但是这条语句在执行...

yonge
2009/04/09
3.2K
4
新书预告 :《Struts2技术内幕》 —— Struts2源码研究和Web开发研究

http://www.iteye.com/topic/1117044 简单做一个新书预告,我写的《Struts2技术内幕》将在下个月问世。 这本书应该是国内比较少见的以研究Struts2的源码为主要目标的技术书籍。源码研究类的书...

ddatsh
2011/10/26
1K
8
用eclipse搭建struts2,运行tomcat9报错...求大神指点..我在MyEclipse上运行是没问题的,在下新手,不知道是少了jar包还是什么问题

信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in t......

编号404
2017/07/02
370
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue warn]: Computed property "activeNames" was assigned to but it has no setter.

在使用 vue,element-ui时,如下代码 <template> <el-form :model="numberValidateForm" ref="numberValidateForm"> <el-form-item> <el-tabs v-model="activeNames" @tab-cl......

牧云橙
20分钟前
2
0
重构-改善既有代码的设计-6.2内联函数

6.2内联函数 动机 本书经常以简短的函数表现动作意图,这样会使代码更清晰易读。但有时候你会遇到某些函数,其内部代码和函数名称同样清晰易读。也可能你充够了该函数的内部实现,使其内容和...

还仙
21分钟前
4
0
Less 混入

混合类似于编程语言中的函数。 Mixins 是一组CSS属性,允许我们将一个类的属性嵌套于另一个类,被嵌入的类可以看作是变量,并且包含类名作为其属性,也就是说我们可以用一个类定义样式然后把...

凌兮洛
24分钟前
4
0
频繁FGC的真凶原来是它

频繁FGC的真凶原来是它 上周排查了一个线上问题,主要现象是CPU占用过高,jvm old区占用过高,同时频繁fgc,我简单排查了下就草草收场了,但是过后我对这个问题又进行了复查,发现问题没有那...

每天晒白牙
25分钟前
4
0
简单的树形菜单如何写

业务需求 数据结构中含有图片、名称、children的树形结构,需要展示出每一级的图片名称和图片,找了些树形图的插件,都没有展示大的图片的,一般都是小图标,就自己试着写一个包含图的简单的...

tianyawhl
26分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部