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的工作原理相关的介绍,顺便抄写过来,用来帮助自 ...
随机推荐
- HBase(3)-安装与Shell操作
一. 安装 1. 启动Zookeeper集群 2. 启动Hadoop集群 3. 上传并解压HBase -bin.tar.gz -C /opt/module 4. 修改配置文件 #修改habse-env ...
- NoSQL入门第一天——NoSQL入门与基本概述
一.课程大纲 二.入门概述 1.为什么用NoSQL 单机MySQL的年代: 一个网站的访问量一般都不大,用单个数据库完全可以轻松应付. 我们来看看数据存储的瓶颈是什么? 1.数据量的总大小 一个机器放 ...
- 20155227 《Java程序设计》实验四 Android开发基础设计实验报告
20155227 <Java程序设计>实验四 Android开发基础设计实验报告 任务一 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二 ...
- PHP学习笔记之析构函数以及static,self,parent关键字
引用 $jordan1 = &$jordan; 当jordan1 = null; //此时会直接调用析构函数 而当无&时,就需要等到所有的引用都为null时,才调用析构函数析构 乔丹 ...
- 考研编程练习----Kruskal
#include <stdio.h> #include <stdlib.h> #define MAX 100 /* 定义边(x,y),权为w */ typedef st ...
- 什么是thinkphp
ThinkPHP是一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开发体验 ...
- [BZOJ2961]共点圆-[凸包+cdq分治]
Description 传送门 Solution 考虑对于每一个点: 设圆的坐标为(x,y),点的坐标为(x0,y0).依题意得,当一个点在圆里,需要满足(x-x0)2+(y-y0)2<=x2+ ...
- [POJ2104]Kth Number-[整体二分]
Description 传送门 Solution 将所有询问放在一起,二分答案的同时把区间[l,r]内的数按大小分类. Code #include<iostream> #include&l ...
- abp 指定方法不生成api
方法上面添加RemoteServiceAttribute特性
- 车架号识别,VIN码识别 助力汽车后市场
又有一家汽配圈新贵引入了小译家的 车架号识别(VIN码识别)技术 那就是明觉科技 是一个服务于汽车后市场 集数据服务.行业数据挖掘 及“互联网+”为一体的汽配信息协作平台 旗下拥有一款全车零配件信息智 ...