Struts2(二)
以下内容是基于导入struts2-2.3.32.jar包来讲的
1.关于StrutsPrepareAndExecuteFilter
启动StrutsPrepareAndExecuteFilter时加载配置文件的流程
init方法依次执行加载以下文件
1.org/apache/struts2/default.properties
默认的基本配置信息
如:struts.action.extension=action,,
此时默认为可以在路径末尾添加.action访问,可自行修改。
2.struts2-core-2.3.32.jar/struts-default.xml
3.src/struts.xml
可通过<constant name="" value=""></constant>更改以上基本的默认配置信息
配置web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>struts</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <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>
package com.ronng.web.action; import com.opensymphony.xwork2.ActionSupport; public class OneAction extends ActionSupport { private static final long serialVersionUID = -1827866244363310821L;
@Override
public String execute() throws Exception {
//三种方式创建Action:普通类、实现Action接口、继承ActionSupport类
//SUCCESS常量是在Action接口已经定义好的,代表字符串"success"
return SUCCESS;
}
}
<?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:唯一标识。以后继承的时候可以使用
namespace:命名空间,作为网络请求连接的一部分
extends 这个是继承的意思,这个包继承了struts-default包 struts-default包定义在struts-default.xml文件中
abstract 这个包是否是抽象包,true为抽象包,false不是抽象。抽象包下的所有的action都不会被创建对象使用
action
是动作类,是控制器
name 控制器名字,也是访问url的一部分 http://localhost:8080/struts/one
class 是控制器的完整路径
method 是要执行的方法,默认是execute
result
是结果集。指定要返回的方式和内容
默认是dispatcher转发
redirect是重定向 include
导入其他的struts配置文件
默认是src目录
--> <package name="com.rong.web.action" namespace="/" extends="struts-default">
<action name="one" class="com.ronng.web.action.OneAction">
<result>/one.jsp</result>
</action>
</package>
<!-- <include file="struts-goods.xml"></include> --> </struts>
2.通配符的使用
<?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>
<!-- http://localhost:8080/struts/one_add -->
<!-- http://localhost:8080/struts/one_add_view -->
<!-- http://localhost:8080/struts/one_execute_one-->
<!-- http://localhost:8080/struts/one -->
<!-- 通用配置*号
one_*_*
例如:one_add_view
{1} 获得 add
{2} 获得view 一般用一个就可以了
one_add
-->
<package name="com.rong.web.action" namespace="/" extends="struts-default">
<action name="one_*_*" class="com.ronng.web.action.OneAction" method="{1}">
<result>/{2}.jsp</result>
</action>
<action name="*" class="com.ronng.web.action.OneAction" method="{1}">
<!-- result标签的name属性不写时,方法必须返回"success";否则两者的值必须相同 -->
<result>/{1}.jsp</result>
</action>
</package>
<!-- <include file="struts-goods.xml"></include> --> </struts>
package com.ronng.web.action; import com.opensymphony.xwork2.ActionSupport; public class OneAction extends ActionSupport { private static final long serialVersionUID = -1827866244363310821L;
@Override
public String execute() throws Exception {
//三种方式创建Action:普通类、实现Action接口、继承ActionSupport类
//SUCCESS常量是在Action接口已经定义好的,代表字符串"success"
return SUCCESS;
} public String add() throws Exception {
//SUCCESS常量是在Action接口已经定义好的,代表字符串"success"
return SUCCESS;
}
public String one() throws Exception {
//SUCCESS常量是在Action接口已经定义好的,代表字符串"success"
//如果在xml配置文件中result标签没有写返回的name属性,此处必须返回小写的"success"字符串
//此处常量SUCCESS等于"success"
return SUCCESS;
}
}
3.数据由前台传到后台
A.通过普通属性传递
index.jsp
除了通过表单提交方式外,还可以通过a标签URL链接的方式以及AJAX请求方式提交数据(这部分略。)
<%@ 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>
<form action="${pageContext.request.contextPath }/one" method="get">
<input type="text" name="username"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
one.jsp略
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="com.rong.web.action" namespace="/" extends="struts-default">
<action name="one" class="com.ronng.web.action.OneAction">
<result>/one.jsp</result>
</action>
</package> </struts>
OneAction.java
package com.ronng.web.action; import com.opensymphony.xwork2.ActionSupport; public class OneAction extends ActionSupport { private static final long serialVersionUID = -1827866244363310821L;
//成员变量名必须与前台的name属性值相同
private String username;
//必须提供set方法,可以不写get方法
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String execute() throws Exception {
System.out.println("username的值为:"+username);
return SUCCESS;
}
}
B.通过对象属性传递
inde.jsp
name 属性的值为user对象的属性,即对象名.属性名
<body>
<form action="${pageContext.request.contextPath }/one" method="get">
<input type="text" name="user.username"/>
<input type="submit" value="提交"/>
</form>
</body>
OneAction.java
提供get和set方法
package com.ronng.web.action; import com.opensymphony.xwork2.ActionSupport;
import com.ronng.web.entity.User; public class OneAction extends ActionSupport { private static final long serialVersionUID = -1827866244363310821L;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println("user对象的username属性值为:"+user.getUsername());
return SUCCESS;
}
}
User.java实体类
package com.ronng.web.entity; public class User {
private String username; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
}
}
C.通过模型驱动传递(实现ModelDriven接口)
index.jsp
<body>
<form action="${pageContext.request.contextPath }/one" method="get">
<input type="text" name="username"/>
<input type="submit" value="提交"/>
</form>
</body>
package com.ronng.web.action; import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.ronng.web.entity.User; public class OneAction extends ActionSupport implements ModelDriven<User> { private static final long serialVersionUID = -1827866244363310821L;
//使用模型驱动ModelDriven(拦截器)必须创建对象
private User user=new User();
@Override
public String execute() throws Exception {
System.out.println("user对象的username属性值为:"+user.getUsername());
return SUCCESS;
}
//实现ModelDriven的getModel方法,为封装数据提供对象
@Override
public User getModel() {
System.out.println("getModel方法!");
return user;
}
}
先调用getModel方法,返回一个可以提供封装数据的对象
4.中文乱码问题
A.GET提交方式
在tomcat服务器的server.xml更改配置文件2017-12-31
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
B.POST提交方式
在struts2-core包中/org/apache/struts2/default.properties属性配置文件中默认编码为:
struts.i18n.encoding=UTF-8
因此,只要前后端的编码统一为UTF-8即可解决该问题,同时,也可根据实际自己去修改
在src/struts.xml中设置常量<constant name="struts.i18n.encoding" value="GBK"></constant>
5.时间格式问题
struts2支持的格式:
2017-12-31 20:20:20
2017年10月01日
如需要yyyy/MM/dd HH:mm:ss格式需要自定义日期格式
2017/08/08 11:22:33
A.局部方式解决
index.jsp
<body>
<form action="${pageContext.request.contextPath }/one" method="get">
<input type="text" name="date"/>
<input type="submit" value="提交"/>
</form>
</body>
OneAction.java
package com.ronng.web.action; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class OneAction extends ActionSupport{ private static final long serialVersionUID = -1827866244363310821L;
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String execute() throws Exception {
System.out.println("date对象的值为:"+date);
return SUCCESS;
}
}
自定义转换器(继承StrutsTypeConverter 抽象类)
package com.ronng.web.convert; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; public class DateConvert extends StrutsTypeConverter { @Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
System.out.println(arg2);
try {
Date date = simpleDateFormat.parse(arg1[0]);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
} @Override
public String convertToString(Map arg0, Object arg1) {
return null;
}
}
新建properties文件,文件名为该Action类类名-conversion.properties
放在与该Action类同一包下,内容为date=com.ronng.web.convert.DateConvert
properties文件内容一般为Action类需要转换的成员变量.属性,现在该示例中时间是date成员变量,并不是对象中的属性,所以不用点号
使用以上方式后,会使原来固有的传递时间的方式失效,如需要原来的生效,则需要添加原来的处理格式
package com.ronng.web.convert; import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; public class DateConvert extends StrutsTypeConverter {
//如果需要添加不同格式的时间,可以继续添加
//可以写成配置文件properties或xml形式,读取配置文件创建对象
//注意空格位置格式,以及中英文字符的区别
DateFormat[] df={
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"),
new SimpleDateFormat("yyyyMMddHHmmss"),
new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss")
};
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
for (DateFormat format : df) {
//出现异常则捕捉,然后继续下一个匹配。找到则返回,否则继续。
//实在没有则返回null
try {
Date date = format.parse(arg1[0]);
return date;
} catch (ParseException e) {
//不应输出到控制台或日志,若输出则会影响调试或者判断
//e.printStackTrace();
System.out.println("测试!");
}
}
return null;
} @Override
public String convertToString(Map arg0, Object arg1) {
return null;
}
}
B.全局方式解决
保留以上方式原有的东西,然后删除局部方式的properties文件
在src根目录下新建xwork-conversion.properties文件
文件内容添加:
6.数据由后台传到前台
方式一:EL表达式
index.jsp
<body>
<form action="${pageContext.request.contextPath }/one" method="get">
<input type="text" name="name"/>
<input type="submit" value="提交"/>
</form>
</body>
one.jsp
<body>
通用的域: ${name }<br/>
request域:${requestScope.name }<br/>
session域:${sessionScope.name }<br/>
application域:${applicationScope.name }<br/>
</body>
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="com.rong.web.action" namespace="/" extends="struts-default">
<action name="one" class="com.ronng.web.action.OneAction">
<result>/one.jsp</result>
</action>
</package> </struts>
OneAction.java
package com.ronng.web.action; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class OneAction extends ActionSupport{ private static final long serialVersionUID = -1827866244363310821L;
//默认是request域的传递
private String name;
//后台向前台传递数据时(展示数据)get方法是必须的
public String getName() {
return name;
}
//前台向后台传递数据时,set方法是必须的
public void setName(String name) {
this.name = name;
}
@Override
public String execute() throws Exception {
System.out.println("前台传过来的name的值为:"+name);
name+=" By EL";
return SUCCESS;
}
}
7.棒符(!)(感叹号、叹号)的使用
实际开发中很少用
TwoAction.java 普通类实现Action
package com.ronng.web.action; public class TwoAction {
public String show(){
System.out.println("show");
return "success";
} public String look(){
System.out.println("look");
return "success";
}
}
struts.xml
default.properties文件默认配置为:关闭动态调用方法
要开启才能使用叹号!
<?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>
<!-- 是否开启动态调用方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="com.rong.web.action" namespace="/" extends="struts-default">
<action name="two" class="com.ronng.web.action.TwoAction">
<result>/two.jsp</result>
</action>
</package> </struts>
浏览器路径为:http://localhost:8080/struts/two!show
浏览器路径为:http://localhost:8080/struts/two!look
Struts2(二)的更多相关文章
- Struts2(二)---将页面表单中的数据提交给Action
问题:在struts2框架下,如何将表单数据传递给业务控制器Action. struts2中,表单想Action传递参数的方式有两种,并且这两种传参方式都是struts2默认实现的,他们分别是基本属性 ...
- Struts2(二)——配置文件struts2.xml的编写
接上一篇博客,这篇博客讲述一下2——9小标题的内容,这些问题都可以在struts2配置文件中设置(当然有的也可以在Struts.properties属性文件,web.xml中进行设置),而且常规开发中 ...
- 浅谈Struts2(二)
一.struts2的跳转 1.action跳转JSP a.默认为forward <action name="action1" class="com.liquidxu ...
- struts2(二) 表单参数自动封装和参数类型自动转换
前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...
- Struts2(二)之封装请求正文、数据类型转换、数据验证
一.封装请求正文到对象中(重点) 1.1.静态参数封装 在struts.xml文件中,给动作类注入值,使用的是setter方法 1.2.动态参数封装 通过用户表单封装请求正文参数 1.2.1.动作类作 ...
- Struts2 (二)
1 自定义结果视图 1.1 自定义一个类实现com.opensymphony.xwork2.Result接口. package com.xuweiwei.action; import com.open ...
- ssh框架-Struts2(二)
上篇文章我们了解了怎么配置struts.xml文件,以及前端控制器配置怎么配置,,Action进阶,Result结果配置,Struts2中的Servlet的API的访问,以及怎么获得请求参数.今天我们 ...
- Struts2(二)工作原理
一.概述 1.struts框架本身分为三个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 2.struts2工作的基本流程: 客户端初始化一个指 ...
- 深入struts2(二) ---stuts2长处和主要包、类功能
1.1 Struts2 上节已讲.struts2在webwork基础发展起来的mvc框架.MVC框架相信一般码农都比較了解,这里不再重说. 在这里只对于一下struts1,struts2做了哪 ...
- Struts2(二):工作原理
struts可查看源码:https://github.com/apache/struts 在学习struts2之前,我先看了一些比较早版本对struts2的工作原理相关的介绍,顺便抄写过来,用来帮助自 ...
随机推荐
- 冒泡排序,C语言实现
冒泡排序是一种稳定排序,时间复杂度平均为O(n^2),最好的时间复杂度为O(n),最坏为O(n^2). 排序时每次只比较当前元素与后一个 元素的大小,如果当前元素大于后一个元素,则交换,如此循环直到队 ...
- CentOS 7.2重启网络报错 Failed to start LSB: Bring up/down
CentOS 7.2重启网络报错 Failed to start LSB: Bring up/down 我的虚拟机原本有两块网卡,一块叫eno16777736,另一块叫eno5033674.本来是正常 ...
- 20155234java实验一
实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没有Linux基础的同学建议先学习Linux基础入门(新版))Vim ...
- 【LG3238】 [HNOI2014]道路堵塞
题目描述 给你一张\(N\)个点.\(M\)条边的有向图,按顺序给定你一条有\(L\)条边的\(1\rightarrow n\)的最短路, 每次断掉这\(L\)条边中的一条(不对后面答案产生影响),求 ...
- Linux系统基础网络配置老鸟精华篇
对于linux高手看似简单的网络配置问题,也许要说出所以然来也并不轻松,因此仍然有太多的初学者徘徊在门外就不奇怪了,这里,老男孩老师花了一些时间总结了这个文档小结,也还不够完善,欢迎大家补充,交流.谢 ...
- mysql 错误代码 1248
1248 - Every derived table must have its own alias (MYSQL错误) 这句话的意思是说每个派生出来的表都必须有一个自己的别名,给派生表加上一个别名就 ...
- c++中的stack实现
通用.类型安全.模板 简直就是巧夺天工的例子
- 添加jQuery方法解析url查询部分
Web前端不同页面间传值可以使用 cookies.localStorage 和 sessionStorage 等本地存储. 但是,今天我们尝试使用 url 查询,假设我们要传递字符串 str 到 mo ...
- 【Jmeter测试】如何使用CSV Data Set Config获取参数
Jmeter提供CSV Data Set Config作为参数获取的一种方式 1.文件名:csv文件的绝对路径2.文件编码:根据运行环境设置,个人常用的是mac和linux,所以这里选择UT ...
- 谈谈你对Java异常处理机制的理解
先谈谈我的理解:异常处理机制可以说是让我们编写的程序运行起来更加的健壮,无论是在程序调试.运行期间发生的异常情况的捕获,都提供的有效的补救动作,任何业务逻辑都会存在异常情况,这时只需要记录这些异常情况 ...