框架结构
1、web层
以前所使用的技术为servlet,和jsp。现在将servlet换为struts2 [st’rʌts]
2、server层
JavaBean
3、dao层
Hibernate
spring贯穿三层(将spring理解为容器,存放三层的对象)
struts2的优势
自动封装参数
参数校验
结果的处理(转发、重定向)
国际化
显示等待页面
防止表单的重复提交
struts2历史
区别:从技术上来讲,struts1(由线程不安全的servlet构建)和struts2(前身是webwork,后与struts1作者合作,改名为struts2,核心为filter即过滤器)没有关系
搭建框架
导包
struts2文件夹中给出了所有的包,但是我们有些用不到。我们可以将基本演示项目(struts-2.3.24\apps\struts2-blank.war【解压打开】)中的包导入。这些包就是基本必须包
书写Action类
新建一个类,须以Action结尾1
2
3
4
5
6
7
8package me.yanrs.a_hello;
public class HelloAction {
public String hello(){
System.out.println("Hello");
return "success";
}
}
书写src/struts.xml
dtd文件约束引入(以struts2的为例)
Library -> Web App library -> struts2-core-2.3.24.jar -> struts-2.3.dtd -> 找个地方新建一个文件,文件名为struts-2.3.dtd,并将其中内容复制到新建的文件中(不能拷贝,只能通过新建,复制内容的方式) -> eclipse -> Windows -> Preferences -> 搜索cate -> XML Catalog -> Add -> Location 选择刚刚保存的dtd文件,Key type选择URL路径 -> key为dtd文件中的url路径。到此dtd的引入就成功了。
配置
1 | <?xml version="1.0" encoding="UTF-8"?> |
创建对应的jsp
创建hello.jsp 内容为hello world!1
2
3
4
5
6
7
8
9
10
11
12<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
hello world!
</body>
</html>
web.xml配置核心过滤器
1 | <?xml version="1.0" encoding="UTF-8"?> |
访问流程以及架构
struts2架构以及访问流程
访问流程
http://localhost:8080/struts_1/hello/HelloAction ( hello为命名空间 )【struts_1是项目的名称,hello是namespace的名称,HelloAction是类的名称】
浏览器发送请求
经过过滤器
寻找struts配置文件
将命名空间名 hello 和 namespace 进行匹配
寻找名称为 HelloAction 的 Action
拿到类的完整类名称,创建出相应的对象
寻找对应的方法,并调用
获取到方法的返回值,并回到struts配置文件,寻找name为返回值的result
转发到result中对应的页面
架构
图没传,太大,后期加图床。
学习流程
灰色为框架自带,不需要实现。红色为需要自己实现,绿色为可选择实现)
struts.xml配置详解
package: 将Action配置封装(其实就是可以在Package中配置很多Action)
package的name: 给包其名字,起到标识作用,随便起,不重复就行。
package的namespace: 给action的访问路径中定义一个命名空间。
package的extends: 继承一个指定包。
package的abstract: 标识属性,表示包不能独立运行,专门被继承。
action的name: 决定了action访问资源名。
action的class: action的完整类名。
action的method: 指定调用action中的哪个方法来处理请求。
result的name: 标识结果处理的名称,与action方法的返回值对应。
result的type: 指定调用哪一个result类来处理结果。(默认使用转发)
inlude:多个struts.xml的配置方式(struts.xml文件可以有多个,只需在src下统一引入即可)1
2<!-- 在src下引入 me/yanrs/dynamic/下的struts.xml配置文件 -->
<include file="me/yanrs/dynamic/struts.xml"></include>
struts2常量配置
默认常量配置位置
Library -> Web App library -> struts2-core-2.3.24.jar -> org.apache.struts2 -> default.properties
修改struts2常量配置方式(方式顺序也是加载顺序)
方式1 (重点)
可以在 struts.xml 中,比如1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?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>
<!-- 在struts.xml中配置struts2常量 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="hello" namespace="/hello" extends="struts-default">
<action name="HelloAction" class="me.yanrs.a_hello.HelloAction" method="hello">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
方式2
可以在src下新建文件为struts.properties,在里面配置即可。
方式3
可以在 web.xml 中,比如1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<?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_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>struts_1</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <!-- ctrl+shift+t 搜索 strutspre 即可查询到,赋值即可 -->
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 在web.xml中配置struts2常量 -->
<context-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
<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>
</web-app>
修改常量配置(在struts.xml中的方式)
struts.i18n.encoding: 国际化,解决post提交的乱码。1
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
struts.action.extension: 配置访问时,url中action的后缀名。例如:将后缀名分别配置为.do和.action1
2<constant name="struts.action.extension" value="do"></constant>
<constant name="struts.action.extension" value="action"></constant>
struts.devMode: 配置struts2是否以开发者模式运行1
<constant name="struts.devMode" value="true"></constant>
struts2配置的进阶
动态方法的调用 (重点)
方式1
通过配置 struts.enable.DynamicMethodInvocation 的方式。默认为false。此方式不利于seo优化。1
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
使用,比如现在action中,有四个方法,分别是增、删、改、查。那么如果要在struts.xml中配置能访问调用这四个方法,按照以前的方法就得在struts.xml中配置四个package,方法分别对应为增、删、改、查。简便的方法就是配置struts.enable.DynamicMethodInvocation,使用的时候只需在url中采用! + 方法名 + 后缀的方法访问即可。
struts.xml完整配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<?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>
<!-- 在struts.xml中配置struts2常量 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.action.extension" value="action,,"></constant>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="dynamic" namespace="/dynamic" extends="struts-default">
<action name="dynamicAction" class="me.yanrs.dynamic.dynamicAction">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
Action类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package me.yanrs.dynamic;
public class dynamicAction {
public String add(){
System.out.println("增加");
return "success";
}
public String del(){
System.out.println("删除");
return "success";
}
public String modify(){
System.out.println("修改");
return "success";
}
public String search(){
System.out.println("查询");
return "success";
}
}
访问的url1
2
3
4
5
6
7
8
9
10
11查询
http://localhost:8080/struts_1/dynamic/dynamicAction!search.action
增加
http://localhost:8080/struts_1/dynamic/dynamicAction!add.action
删除
http://localhost:8080/struts_1/dynamic/dynamicAction!del.action
修改
http://localhost:8080/struts_1/dynamic/dynamicAction!modify.action
方式2(重点)
使用通配符的方式
struts.xml完整配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<?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>
<!-- 在struts.xml中配置struts2常量 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.action.extension" value="action,,"></constant>
<constant name="struts.devMode" value="true"></constant>
<package name="dynamic" namespace="/dynamic" extends="struts-default">
<action name="dynamicAction_*" class="me.yanrs.dynamic.dynamicAction" method="{1}">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
Action类1
同方式1
访问的url1
2
3
4
5
6
7
8
9
10
11增加
http://localhost:8080/struts_1/dynamic/dynamicAction_add.action
删除
http://localhost:8080/struts_1/dynamic/dynamicAction_del.action
修改
http://localhost:8080/struts_1/dynamic/dynamicAction_modify.action
查询
http://localhost:8080/struts_1/dynamic/dynamicAction_search.action
struts2中的默认配置 (默认值,可选择性配置)
method属性: 默认值为execute(也就是说,如果action中的方法如果为execute,那么此项可以不配置)
result的name属性: 默认值为success(如果action中的返回值为success,那么此项可以不配置)
result的type属性: 默认值为dispatcher(默认转发)
class属性:默认值为
配置默认的action
Action类详解
方式1
1 | package me.yanrs.create_action; |
方式2
1 | package me.yanrs.create_action; |
方式3 (重点)
1 | package me.yanrs.create_action; |
crm客户列表的实现
其他
如何快速的调用重写接口,toString等选项,快捷键为 alt + shift + s
如何查看某个方法在哪个包下,在eclipse中,在文件列表栏目上方,选择双向小箭头,在按住ctrl点击方法名,文件栏就能实现跳转。