Struts2 - Convertion
Struts2中的Convertion插件是比较有用,它可以简化很多操作,比如不需要一个一个Action在struts.xml中设置。当然,最有意义的是它与rest插件一起整合使用,可以完成web-site中的restful操作。具体可以参考Struts包中的例子:
http://struts.apache.org/release/2.3.x/docs/convention-plugin.html
http://struts.apache.org/development/2.x/docs/rest-plugin.html
rest plugin的使用后面再写,先试下convertion plugin。由于struts的配置太多,只例出一些比较实用和常用的先,其它的之后再整理一下。
eclipse建j2ee工程就不屁话了。
1)加入包:struts2-convention-plugin-2.3.16.1.jar
最好把另一个包也加上(发布时要把它删除,不然别人就可以很容易就得到所有的action list):struts2-config-browser-plugin-2.3.16.1.jar
browser这个plugin可以用于查看当前web-site所有的struts action和明细。使用方法:
在浏览器地址栏上输入:http://localhost:8080/{WEB-SITE}/config-browser/actionNames.action
比如:http://localhost:8080/TestWeb/config-browser/actionNames.action
2)修改web.xml,加入Struts2的filter,这与普通的使用没区别。
<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>
3) 在src目录下新建一个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> <!-- 把它设置为开发模式,发布时要设置为false -->
<constant name="struts.devMode" value="true" />
<!-- 设置在class被修改时是否热加载,发布时要设置为false -->
<constant name="struts.convention.classes.reload" value="true"/>
<!-- 自动动态方法的调用,使用这个设置后可以这样调用:action!method -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 指定jsp文件所在的目录地址 -->
<constant name="struts.convention.result.path" value="/WEB-INF/content/" />
<!-- 使用struts-default默认的转换器,如果是rest的使用:rest-default,rest需要rest的jar插件 -->
<constant name="struts.convention.default.parent.package" value="struts-default"/> </struts>
这里最重要的的就这几个设置。(留意xml的注释)
需要说明一下的是这两个key
name=struts.enable.DynamicMethodInvocation,这个设置为true,就可以动态的调用action中的public方法,如果设置false,就不可以调用了。
name=struts.convention.result.path,这个设置的值是action对应的jsp文件所存放的目录所在地址。如果没有设置这个值,其实stutrs2默认就是/WEB-INF/content这个目录。
4)新建一个package:com.my.actions,及在这个package中新建一个LoginAction.java
package com.my.actions; import org.apache.struts2.convention.annotation.Action; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial")
public class LoginAction extends ActionSupport { private String username; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} @Override
public String execute() throws Exception {
return SUCCESS;
} public String test() {
System.out.println("test");
return "test";
} public String edit(){
return "edit";
} }
5)在/WEB-INF/content目录下新建三个jsp:login.jsp、login-test.jsp、login-edit.jsp
login.jsp和login-test.jsp内容随便,login-edit.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>Insert title here</title>
</head>
<body>
edit page.<br/>
user: ${ requestScope.username }
</body>
</html>
主要用于打印username。
好了,完成了。
在浏览器中键入:
http://localhost:8080/TestWeb/login
-- 这个是会自动定位到login.jsp
http://localhost:8080/TestWeb/login!test
-- 这个会定位到test()方法
http://localhost:8080/TestWeb/login!edit?username=robin
-- 这个会定位到edit()方法,同时传入一个username参数并在页面中显示。
事实上,我们还可以在LoginAction.java中再加一个@Action标注:
@Action("login-show")
public String show(){
return "show";
}
这样就会有一个新的Action所产生,可以在浏览器中输入:http://localhost:8080/TestWeb/login-show
Action的明细可以在browser plugin中查看。
jsp的命名规则是<Action>-<Method>.jsp,如:login-test.jsp
很不喜欢方法的调用使用感叹号!还是使用rest吧哈。
Struts2 - Convertion的更多相关文章
- Struts2 - Rest(1)
Struts2提供了一个restful的插件:struts2-rest-plugin-2.3.16.1.jar 这个插件可以把Struts2当做restful来使用,不过它的rest功能目前来说有点“ ...
- Struts2 注解零配置方法(convention插件使用)
最近接触到一个新的项目,是做一个使用S2SH的电子商务商城的二次开发.之前使用过S2SH,在此之前的项目中,Struts2 使用的是XML配置而这个项目是使用注解.在这个项目中,注解还不需要使用Act ...
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- 菜鸟学Struts2——Interceptors
昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...
- 菜鸟学Struts2——零配置(Convention )
又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...
- 菜鸟学Struts2——Results
在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...
- 菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 13、零配置Struts2开发
Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...
随机推荐
- 深入理解Linux修改hostname 转
当我觉得对Linux系统下修改hostname已经非常熟悉的时候,今天碰到了几个个问题,这几个问题给我好好上了一课,很多知识点,当你觉得你已经掌握的时候,其实你了解的还只是皮毛.技术活,切勿浅尝则止! ...
- 《JavaScript模式》第2章 基本技巧
@by Ruth92(转载请注明出处) 第2章 基本技巧 一.编写可维护的代码 阅读性好 具有一致性 预见性好 看起来如同一个人编写 有文档 编写注释 编写 API 文档 @namespace:用于命 ...
- Apache搭建多个站点方法详解
www.111cn.net 编辑:Bolshevik 来源:转载 Apache的虚拟主机是一种允许在同一台机器上配置多个不同站点的web服务器环境的,就是iis一样可以创建多站点了,但是apache需 ...
- ui学习笔记---第十五天数据库
数据库的使用 常见的数据库有MySQL SQL Server SQLite Oralce等 在iOS开发中通常使用SQLite数据库,这是一个轻量级的数据库,可以在火 ...
- DEDECMS调用特定ID文章内容的实现方法
DEDECMS调用特定ID文章内容的实现方法 {dede:loop table='dede_addonarticle' sort='aid' row='8' if='aid=524'} [field: ...
- (转载)Hadoop map reduce 过程获取环境变量
来源:http://www.linuxidc.com/Linux/2012-07/66337.htm 作者: lmc_wy Hadoop任务执行过程中,在每一个map节点或者reduce节点能获取 ...
- HTML5学堂 全新的HTML5/前端技术分享平台
HTML5学堂 全新的HTML5/前端技术分享平台 HTML5学堂是做什么的? HTML5学堂~http://www.h5course.com~由多名热爱H5的讲师们组成的一个组织.致力于构建一个前端 ...
- [AHOI 2006][BZOJ 1269]文本编辑器editor
好吧,我承认这是我用来刷随笔数的喵~ 这是一道 splay 裸题,但还是有想本傻 X 一样根本不会写 splay 的,于是乎又用 treap 水过了 splay 的常数我还是知道的,所以真是不知道那些 ...
- IAR MSP430如何生成烧写文件
IAR生成430烧写方法有2种, 第一种是:将工程的debug模式切换成release模式,看图片操作. 那个.d43文件就是仿真调试模式的文件. 这里的test.txt文件就是烧写文件了,不要 ...
- 递归遍历多维数组(树数据结构)的超级简单方式,并且可以递归超过200层,摘自<<PHP精粹:编写高效PHP代码>>
<?php $array = array( "Hello", // Level 1 array( "World" // Level 2 ), array( ...