非本人总结的笔记,抄点笔记复习复习。感谢传智博客及黑马程序猿
Struts2概述
什么是框架
框架帮我们实现一部分功能,使用框架可以省略一些代码
主流的框架
SSH Struts2、Spring、Hibernate。
其他框架:MyBatis、SpringMVC
什么是Struts2 框架
Struts2应用在web层框架,符合MVC思想
JavaEE三层结构:web层、Service层、持久化层(dao)
Struts2在Struts1和webwork框架基础上发展的全新的框架
Struts2核心功能:
1、允许POJO(Plain Old Java Object)对象作为Action
2、Action的execute方法不再与ServletAPI耦合,更易测试
3、支持更多的视图技术(JSP、FreeMarker、Velocity)
4、基于SpringAOP思想的拦截器机制,更易扩展
5、更强大、更易用输入校验机制
6、整合Ajax支持
JavaEE有三层支持
1、Web层:Struts2、Struts1
2、Service层:Spring
3、持久化层:Hibernate、mybatis
Web层框架特点
Web层有前端控制器(过滤器)
Struts2的入门案例
导入jar包
配置Struts2核心过滤器web.xml
<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>
使用的struts2提供的过滤器,不需要写,直接配置就可以
创建Action继承ActionSupport
public class HelloAction extends ActionSupport {
/*
* 之前学习的servlet中,请求servlet,自动执行servlet里面service方法
* service根据请求调用doget和dopost方法
* 1 创建servlet:实现接口,继承类
* 2 配置servlet访问路径
* 访问action时候,默认自动执行action里面名称是 execute方法
* 配置action访问路径
*/
public String execute() {
return "success";
}
}
配置Action的访问路径
配置文件名必须是struts.xml,必须放在src下面,xml文件需要引入dtd约束
<?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>
<!-- 配置action的访问路径 -->
<package name="hellodemo" namespace="/" extends="struts-default">
<!-- action标签的里面的name属性是访问名称 -->
<action name="index" class=""com.action.IndexAction>
<result name="ok">/index.jsp</result>
</action>
</package>
</struts>
<packname name可以随意取值 extends值是固定的struts-default namespace一般写/
<action name根据name值进行访问 Class是action的访问路径
访问action
访问action:http://localhost:8080/web/index.action
Struts2的流程分析
Struts2配置文件的加载顺序
Struts2配置文件,由核心控制器加载StrutsPrepareAndExecuteFilter(预处理,执行过滤)
init_DefaultProperties(); //1 org/apache/struts2/default.properties
init_TraditionXmlConfigurations(); //2 struts-default.xml struts-plugin.xml struts.xml
init_LegacyStrutsProperties(); //3 自定义struts.properties
init_CustomConfigurationProvider(); // 自定义配置提供
init_FilterInitParameters(); //web.xml
init_AliasStandardObjects(); //Bean加载
default.properties 该文件保存在struts2-core-2.3.7.jar 中org.apache.struts2包里面 (常量的默认值)
struts-default.xml 该文件保存在 struts2-core-2.3.7.jar (Bean、拦截器、结果类型)
struts-plugin.xml 该文件保存在struts-Xxx-2.3.7.jar (在插件包中存在
,配置插件信息)
struts.xml 该文件是web应用默认的struts配置文件 (实际开发中,通常写struts.xml)
struts.properties 该文件是Struts的默认配置文件 (配置常量 )
web.xml 该文件是Web应用的配置文件(配置常量)
Struts2的配置文件Struts.xml中packname配置
package类似于包,区别不同的action
name:给package起名字,不要写中文,包含特殊符号,有多个package,但是name值不能相同
extends:属性是固定的,struts-default,表示package里面具的action具有Struts2的功能
namespace:属性值和action标签的name属性值,共同构成访问地址
<!-- 配置action的访问路径 -->
<package name="hellodemo" namespace="/aa" extends="struts-default">
<!-- action标签的里面的name属性是访问名称 -->
<action name="index" class=""com.action.IndexAction>
<result name="ok">/index.jsp</result>
</action>
</package>
namespace的值是/aa
action的name值是index
访问:http://localhost:8080/HelloWorld/aa/index.action
Struts2的配置文件struts.xml中action配置
<action>元素配置默认值
元素 | 属性 | 默认值 |
---|---|---|
<package> | namespace | / |
<action> | class | ActionSupport类 |
<result> | name | success |
配置action的访问名称,返回到路径:action标签要写到package里面,一个package里面可以有多个action配置
action配置
属性 | 配置 |
---|---|
name | 和package里面的namespace值,构成访问名称,可以在多个action,但是name的值不能相同 |
class | Action的全路径,包括类路径 |
method | 默认执行execute方法,但是可以设置执行其他的方法 |
result标签
属性 | 配置 |
---|---|
name | 对应action方法返回值 |
type | 如何到路径中(转发和重定向) |
路径写法强调,Action的name值不要加/
配置文件struts.xml中默认action和action默认处理类
1.如果Action的class没有配置,执行action可以访问到,默认执行的Struts2的ActionSupport,执行这个类里面的execute方法
2.如果随便输入一个地址,也执行某个action
Struts2的常量配置
struts2默认常量在default.properties中配置
第一种 在src下面创建struts.properties中配置
格式要求struts.properties
格式:struts.devMode=true
第二种 在struts.xml中进行修改
常用常量
设置表单post提交中午乱码
<constant name="struts.i18n.encoding" value="UTF-8"/>
修改struts.xml不需要重新启动服务器,自动加载
<constant name="struts.configuration.xml.reload" value="true"/>
访问struts2框架Action访问路径(扩展名)
<constant name="struts.action.extension" value="action"/>
浏览器缓存,false不缓存,true缓存,产品环境设置true、开发环设置false
<constant name="struts.serve.browserCache" value="false"/>
提供详细报错页面,修改struts.xml后不需要重启服务器
<constant name="struts.devMode" value="true"/>
第三种 在web.xml中修改
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
Struts2的配置文件struts.xml中的include配置
<include file="cn/demo/User.xml"/>
Struts2的Action三种编写方式
第一种创建普通Java类,这个类不需要实现任何接口,不继承任何类
/**
*创建普通Java类,这个类不需要实现任何接口,不继承任何类
/
public class UserAction{
public String execute(){
return "success";
}
}
第二种创建类,实现接口,Action
创建类,实现Action接口,在Action接口里面有几个常量
常量 | 说明 |
---|---|
ERROR | 异常 |
INPUT | 输入数据类型不一样 |
LOGIN | 返回登录页面 |
NONE | 返回null |
SUCCESS | 成功 |
public class UserAction implements Action{
public String execute() throws Exception{
//Action接口里面的常量
retrun SUCCESS;
}
}
第三种创建类,基础ActionSupport(建议使用)
ActionSupport类是Action接口的实现类
public class UserAction extends Actionsupport{
public String execute() throws Exception{
retrun SUCCESS;
}
}
Struts2访问action的方法
第一种方法在method属性值里面写要执行方法的名称
在action里面有method属性,在method属性里面写要执行的方法名称,比如在action里面创建add方法。缺点:每个方法都需要配置action,造成大量的action配置
<action name="dome1" class="...." method="add"/>
第二种方法使用通配符方式配置(经常使用)
使用通配符方式配置,使用*星号,表示任意值
第三种方式使用动态访问方式
1、设置常量值为true
struts.enable.DynamicMethodInvocation=true 常量值为true
配置不需要使用method属性
action的name值!,执行的action的方法名称
Struts2访问Servlet的方式
第一种方式使用类ActionContext,里面的不同方法实现
使用类ActionContext,里面的不同方法实现
1、getContext()返回ActionContext实例对象
2、getParameters()类似调用HttpServletRequest的getParameterMap()
演示一:通过表单提交数据,在action获取数值
<form action="${pageContext.request.contextPath}/servletDemo1.action" method="post">
username:<input type="text" name="username"/>
<br/>
password:<input type="text" name="password"/>
<br/>
<input type="submit" value="提交"/>
</form>
//ActionContext的实例
ActionContext actioncontext = ActionContext.getContext();
//使用getParameters()
//返回的map集合,key是表单输入项name的属性值,value是输入的值
Map<String, Object> map = actioncontext.getParameters();
//获取到username值
//返回value值是数据形式
String[] username = (String[]) map.get("username");
//获取到password值
String[] password = (String[]) map.get("password");
System.out.println(Arrays.toString(username));
System.out.println(Arrays.toString(password));
return SUCCESS;
演示二:向三个域对象里面设置值,到jsp页面中获取三个域对象里面的值
//向request域设置值
actioncontext.put("req", "requestValue");
//向session域设置值
actionicontext.getSession().put("session", "sessionValue");
//向ServletContext域设置值
actioncontext.getApplication().put("apps", "appsvalue");
第二种方式实现不同接口,分别得到Servlet里面request、response、servletcontext对象
public class UserAction extends ActionSupport implements ServletRequestAware, ServletResponseAware{
}
第三种方式使用类ServletActionContext类里面静态方法得到request、response、servletcontext对象
static PageContext getPageContext();
static HttpServletRequest getRequest();
static HttpServletResponse getResponse();
static ServletContext getServletContext();
案例
第一步:导入jar包
第二步:配置struts2核心过滤器web.xml
<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>
第三步:配置LoginAction
package cn.itcast.login;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
public String login() {
//约定用户名admin 密码1314
//获取表单数据
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password");
//判断
if("admin".equals(username) && "1314".equals(password)) {
return "loginsuccess";
} else {
return "loginfail";
}
}
}
第四步:创建表单请求页面login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'form1.jsp'starting page</title>
</head>
<body>
<form action="*${pageContext.request.contextPath}/person_login.action"
method="post">
username: <input type="text" name="username"/>
<br/>
password: <input type="text" name="password"/>
<br/>
<inputtype="submit" value="提交"/>
</form>
</body>
</html>
第五步(1):和LoginAction在一个包下配置login.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>
<!-- 修改常量 -->
<constant name="struts.configuration.xml.reload" value="true"</constant>
<!-- 登录的actin -->
<package name="login" extends="struts-default" namespace="/">
<action name="person_*" class="cn.itcast.login.LoginAction" method="{1}">
<result name="loginsuccess">/success.jsp</result>
<result name="loginfail">/fail.jsp</result>
</action>
</package>
</struts>
第五步(2)在用include配置到struts.xml中
<include file="cn/itcast/action/login.xml"></include>
第六步创建result的结果页面success.jsp和fail.jsp
success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
<head>
<title>My JSP'success.jsp' starting page</title>
</head>
<body>
login success
</body>
</html>
fail.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
<head>
<title>My JSP 'fail.jsp' starting page</title>
</head>
<body>
login fail
</body>
</html>
最后简单总结
1、Struts2编写Action三种方式
2、Struts2访问action的三种方式
3、Struts2访问servlet的三种方式
过去2016
在过去的几个月里,一直在维护实验室的项目,那段时间,晚上都睡在实验室,白天上课睡觉,很少来简书逛逛了,偶尔也学点东西,不过感觉还是需要一些项目来练习,否则就容易忘记。暑假也学了安卓,虽然安卓的确让我感觉到神奇,但是我还是放弃了,也就偶尔玩玩看看。
未来2017
把那些笔记文档搞定,写几个SSH或者SSM的项目,争取在暑假出去找工作之前学好,还有就是计算机设计大赛,这个看情况吧。
10月份之前把驾照考到手。
最后,再过十几个小时,我就该坐火车回家了,对那三个留在实验室的小伙伴说声对不起了,我提前跑路了。