文章目录
struts2基础
struts2处理步骤
struts2处理步骤
1、客户端浏览器发送一个HTTP请求,例如,请求/somepage .action、/video/somevideo.mp4等;
2、web容器收到请求后,将请求传递给一个标准的ActionContextCleanUp过滤器来清除属性,不让后续的过滤器清除,从而延长Action中属性的生命周期,以便页面进行访问;
3、ActionContextCleanU批处理过后再经过其他过滤器,如SitMesh等,传递给核心控制器StrutsPrePareAndExecuteFilter;
4、StrutsPrePareAndExecuteFilter調用AcionMapper確定請求那個Action將控制器委派給ActionProxy代理
5、ActionProxy代理調用配置管理器ConfigurationManager从配置管理器ConfigurationManager从配置文件struts.xml中读取信息,创建ActionInvocation对象;
6、ActionInvocation在调用Action之前会一次调用所有配置拦截器脸,一旦Action执行结果返回字符串,ActionInvocation会根据该结果字符串查找对应的Result;
7、Result会调用视图模板如JSP、FreeMarker来显示,并在客户端HTTP相应之前,以相反的顺序执行拦截器链。
8、最后HTTP相应被返回给核心控制器StrutsPrepareAndExecuteFilter,一次经过web.xml中配置过滤器,发送给客户端。
创建一个struts2项目
1、配置StrutsPrepareAndExecuteFilter,就是web.xml配置过滤器
2、创建输入视图,index.jsp页面
3、创建业务与控制器,就是action连接
4、配置业务控制器struts.xml文件
5、创建结果视图,就是执行后返回的视图result.jsp或error.jsp
1、配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>chapter02</display-name>
<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>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
2、创建输入视图
<%@ 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>用户记录</title>
</head>
<body>
<form action="user.action" method="post">
用户名:<input type="text" name="userName"><br/>
地址:<input type="text" name="address"><br/>
电话:<input type="text" name="telephone"><br/>
邮箱:<input type="text" name="email"><br/>
<input type="submit" name="" value="提交">
</form>
</body>
</html>
3、创建业务控制器
package com.qst.chapter02.action;
public class UserAction {
//用户名
private String userName;
//地址
private String address;
//电话
private String telephone;
//邮箱
private String email;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String execute() throws Exception{
if(userName.length() > 0 & address.equals("青岛")){
return "success";
}else{
return "error";
}
}
}
struts.xml文件没有配置,默认执行execute方法
4、配置业务控制器,struts.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<!-- struts2的action都必须配置在package力 -->
<package name="default" namespace="/" extends="struts-default">
<!-- 定义一个名为user的action,实现类 -->
<action name="user" class="com.qst.chapter02.action.UserAction">
<result name="success">/result.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
5、创建结果视图
result.jsp和error.jsp
result.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>显示用户信息</title>
</head>
<body>
用户名:${param.userName}<br/>
地址:${param.address}<br/>
电话:${param.telephone}<br/>
邮箱:${param.email}<br/>
</body>
</html>
error.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>错误页面</title>
</head>
<body>
您输入的信息不符合要求,重新输入。
</body>
</html>
struts2进阶
struts2常量配置(struts.xml)
建议在struts.xml文件中配置相应属性
<struts>
<!-- 指定struts2是否使用开发模式,默认为false,开发阶段设置为true -->
<constant name="struts.devMode" value="true"/>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 指定web应用默认,Locale,默认en_US -->
<constant name="struts.locale" value="en_US"></constant>
<!-- 指定默认的web应用默认编码集,默认UTF-8 -->
<constant name="struts.il8n.encoding" value="UTF-8"></constant>
<!-- 处理multipart/form-data的MIME类型(文件上传)请求,默认jakarta,可以支持cos、pell和common-
fileupload文件上传 -->
<constant name="struts.multipart.parser" value="jakarta"></constant>
<!-- 指定上传文件的临时保存了路径 -->
<constant name="struts.multipart.saveDir" value="javax.servlet.context.tempdir"></constant>
<!-- 指定上传文件的最大字节数 -->
<constant name="struts.multipart.maxSize" value="1024"></constant>
<!-- 指定将http请求映射指定的action映射器中,默认是org.apache.struts2.dispatcher.mapper.DefaultActionMapper -->
<constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.DefaultActionMapper"></constant>
<!-- 指定需要struts2处理的请求后缀,默认值是action,即所有与*.action匹配的请求都有struts2处理 -->
<constant name="struts.action.extension" value="action"></constant>
<!-- 默认ObjectFacotry Bean -->
<constant name="struts.objectFactory" value=""></constant>
<!-- 设置浏览器是否缓存静态内容,开发阶段通常设置为false -->
<constant name="struts.serve.static.browserCache" value="false"></constant>
<!-- 当struts.xml改变后,系统是否指定重新加载文件,默认为false,开发阶段为true -->
<constant name="struts.configuration.xml.reload" value="false"></constant>
<!-- 自定XSLT Result是否使用样式表缓存,开发阶段通常设置为true -->
<constant name="struts.xslt.nocache" value="true"></constant>
<!-- 指定struts2所需要的的国际化资源文件多个文件之间使用英文,隔开 -->
<constant name="struts.customer.il8n.resources" value=","></constant>
<!-- 指定struts2框架加载用户自定义敞亮文件,多个文件用英文","隔开 -->
<constant name="struts.customer.properties" value=","></constant>
</struts>
struts2包配置
1、修改namespace命名空间(/表示:应用路径/user.action-- 如果是/admin表示:应用路径/admin/user.action)
2、修改action name属性,相应的拦截的action
3、修改映射页面result中的相应页面
<struts>
<constant name="struts.devMode" value="true"/>
<!-- struts2的action都必须配置在package力 -->
<package name="default" namespace="/" extends="struts-default">
<!-- 定义一个名为user的action,实现类 -->
<action name="user" class="com.qst.chapter02.action.UserAction">
<result name="success">/result.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
包含其他配置文件
<struts>
<include file="struts-part1.xml">
</struts>
实现action
pojo实现方式
普通的pojo类,通常还包含一个五参数的execute方法返回值为字符串
package com.qst.chapter03.action;
public class LoginAction {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute(){
System.out.println("用户名:"+userName);
System.out.println("密码名"+password);
if(userName.startsWith("qst")&&password.length()>=6){
return "success";
}else{
return "error";
}
}
}
action接口实现方式
继承ActionSupport类
validate()验证方法struts2框架自动返回inupt输入视图。
package com.qst.chapter03.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction3 extends ActionSupport{
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute(){
System.out.println("用户名:"+userName);
System.out.println("密码名"+password);
if(userName.startsWith("qst")&&password.length()>=6){
return SUCCESS;
}else{
return ERROR;
}
}
public void validate(){
//简单验证用户输入
//struts自动返回input接口
if(this.userName == null || this.userName.equals("")){
this.addFieldError("userName", "用户名不能为空!");
System.out.println("用户名为空!");
}
if(this.password == null || this.password.length() < 6){
this.addFieldError("password", "密码不能为空且长度不能小于6");
System.out.println("密码不能为空且长度不能小于6");
}
}
}
ActionContext 访问servletAPI
常用方法
方法 | 功能描述 |
---|---|
Object get(Object key) | 获取属性值,与HttpServletRequest的getAttribute(String name)方法类似 |
Map getApplication() | 返回一个Map对象,该对象模拟web应用对应的ServletContext对象 |
static ActionContext getcONTEXT() | 静态方法,用于获取系统的ActionContext对象 |
Map getParameters() | 获取所有的请求参数,类似HttpServletRequest对象的getParameterMap() |
Map GetSession | 返回一个Map对象,该对象模拟HttpSession实例 |
void setApplication(Map application) | 直接传入一个Map独享,该对象键值对转换成application的属性名和属性值 |
void setSession(Map session) | 直接传入一个Map对象,该对象的Map对象里的键值对转换成session的属性名和属性值 |
例如
package com.qst.chapter03.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class ClickNumAction extends ActionSupport{
public String execute(){
ActionContext ctx = ActionContext.getContext();
Integer num = (Integer)ctx.getApplication().get("num");
if(num==null){
num=1;
}else{
num++;
}
ctx.getApplication().put("num", num);
return SUCCESS;
}
}
该实例先试用actioncontext.getContext()静态方法获取系统的ActionContext对象,再调用ActionContext对象的getApplication方法获取ServletCotnext对象的Map对象。进行get和put操作。
访问servletapi
注意有三种接口访问不同对象
接口名 | 描述 |
---|---|
ServletContextAware | 实现该接口action直接访问web应用的ServletContext |
ServletRequestAware | 实现该接口的Action可以直接访问用户请求的HttpServletRequest实例 |
ServletResponseAware | 实现该接口的Action可以直接访问服务器响应的HttpServletRespone实例 |
继承接口之后,要定义响应的属性
比如
private HttpServletRequest request;
继承servletRequestAware方法
package com.qst.chapter03.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction4 extends ActionSupport implements ServletRequestAware{
private String userName;
private String password;
private HttpServletRequest request;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request = request;
}
public String execute(){
System.out.println("用户名:"+userName);
System.out.println("密码名"+password);
if(userName.startsWith("qst")&&password.length()>=6){
HttpSession session = request.getSession();
session.setAttribute("CurUser", userName);
return SUCCESS;
}else{
return ERROR;
}
}
public void validate(){
if(this.userName == null || this.userName.equals("")){
this.addFieldError("userName", "用户名不能为空");
System.out.println("用户名为空!");
}
if(this.password == null || this.password.length() < 6){
this.addFieldError("password", "密码不能为空且长度不能小于6");
System.out.println("密码不能为空且长度不能小于6");
}
}
}
配置Action(包括动态方法调用)
在struts.xml中配置相应的Action
package包组织action,在struts.xml中通过使用package中action配置action,需要指定action元素的name和class属性
name:指定actino名字,该action中处理url,比如,login表示该action的url为login.action
class:值action实现类。
result元素表示返回映射,比如在java文件返回值是return “success”
表示返回success映射。
<package name="default" namespace="/" extends="struts-default">
<action name="login" class-"com.qst.chapter03.action.LoginAction">
<result name="success">ok.jsp</result>
</action>
</package>
前面都是单个action对应一个类的方法execute,那么如何调用action里面不同方法?
动态方法调用
index.jsp
<a href="product!edit.action?productId=1000">编辑</a>
<a href="product!del.action?productId=1000">删除</a>
前提在productAction中有edit和del方法,struts.xml中配置了action name=“product”。
我们也可以使用通配符调用方法
<action name="*product" class="com.qst.chapter03.action.ProductAction" method="{1}">
<result name="edit" type="dispatcher">/edit.jsp</result>
<result name="del">/del.jsp</result>
<allowed-methods>del,edit</allowed-methods>
</action>
访问直接使用
<a href="editproduct.action?productId=1000">编辑</a>
<a href="delproduct.action?productId=1000">删除</a>
result
局部result
<package name="test" extends="struts-default">
<action name="login" class="com.qst.chapter03.action.LoginAction">
<result name="success" type="dispatcher">/ok.jsp</result>
</action>
</package>
全局reuslt
<package name="test" extends="struts-default">
<global-results>
<result>/ok.jsp</result>
</global-results
<action name="login" class="com.qst.chapter03.action.LoginAction">
</action>
</package>
result类型
结果类型 | 描述 |
---|---|
dispatcher | 应用于整合jsp技术 |
redirect | 重定向其他url |
redirectAction | 重定向其他Action |
chain | 用于进行action链式处理 |
chart | 用于整合JFreeChart技术 |
dispatcher | 应用于整合jsp技术 |
freemarker | 整合FreeMarker |
httpheader | 控制特殊http |
jasper | 整合jasperReport报表技术 |
jsf | 整合JSF技术 |
stream | 向浏览器返回inputStream,一般用于文件下载 |
tiles | 整合Tiles |
velocity | 整合velocity |
xslt | 整合xml/XSLT技术 |
plainText | 显示某个页面源代码 |
默认dispatcher技术。
异常(抛出异常的映射)
需要配置 两个属性exception和result属性
exception:用于指定action出现异常所映射的类型(java.lang.Exception)
result:指定转入action中的error或者中配置的元素
LoginAction5.java
package com.qst.chapter03.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction5{
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute(){
System.out.println("用户名:"+userName);
System.out.println("密码名"+password);
if(userName.startsWith("qst")&&password.length()>=6){
return "success";
}else{
throw new RuntimeException("用户登录失败!");
}
}
}
struts.xml
<!-- 定义一个名为user的action,实现类 -->
<action name="login5" class="com.qst.chapter03.action.LoginAction5">
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
<result name="success">/ok.jsp</result>
<result name="error">/error.jsp</result>
</action>