Struts2是基于MVC设计模式的WEB框架,这个框架的的核心就是J2EE的过滤器Filter,通过Filter把所有请求转交给Struts2来处理
要使用Struts首先我们先要导入JAR包,同样的,我把完整的Struts分享给大家:
链接:https://pan.baidu.com/s/1rQQAlusPkggK4SODJz2tNA 密码:6fi3
再导入JAR包,之后,我们先要配置一个Filter,因为Struts是基于Filter的,我们要把所有请求都过滤给Struts的过滤器
<web-app>
<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>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
配置好web.xml之后,我们要在src目录下配置struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="basicstruts" extends="struts-default">
<action name="index">
<result>index.jsp</result>
</action>
</package>
</struts>
这是一个最简单的配置,含义就是当我们访问index这个路径时,跳转到index.jsp这个页面
下面,我们可以自己编写一个index.jsp其中的内容随意编写,之后,我们启动tomcat,来访问http://localhost:8080/struts2/index这个路径,如果没有出错的话,我们就可以看到我们编写的struts.jsp了,这是一个最简单的Struts项目,之后,我们再一点点的深入
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
显示Model层的数据
我们先来编写一个JavaBean文件,用来存取数据
package cn.encore.bean;
public class Rapper {
int id;
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后,我们编写一个Action
package cn.encore.action;
import cn.encore.bean.*;
public class RapperAction {
private Rapper rapper;
public String show() {
rapper = new Rapper();
rapper.setName("王闪火");
return "show";
}
public Rapper getRapper() {
return rapper;
}
public void setRapper(Rapper rapper) {
this.rapper = rapper;
}
}
然后,编写一个show.jsp用于显示数据
<%@page isELIgnored="false"%>
${rapper.name}
因为我们在RapperAction中添加了Getter,Setter方法,程序在访问到我们这个Action时,RapperAction会把rapper对象通过request.setAttribute("rapper", rapper)的rapper这个Key上,这样,在JSP页面中,就方便我们去使用EL表达式来使用这个类了
然后,我们把show.jsp配置到struts.xml中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="basicstruts" extends="struts-default">
<action name="showRapper" class="cn.encore.action.RapperAction" method="show">
<result name="show">show.jsp</result>
</action>
</package>
</struts>
然后,我们访问http://localhost:8080/struts2/showRapper这个路径,就可以看到Jsp中取出了我们的王闪火!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
提交数据到action
首先,我们先编写一个addRapper.jsp页面,用于提交数据
<html>
<form action="addRapper">
<input type="text" name="rapper.name">
<br/>
<input type="submit" value="提交">
</form>
</html>
然后,我们把addRapper配置到struts.xml中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="basicstruts" extends="struts-default">
<action name="showRapper" class="cn.encore.action.RapperAction" method="show">
<result name="show">show.jsp</result>
</action>
<action name="addRapper" class="cn.encore.action.RapperAction" method="add">
<result name="show">show.jsp</result>
</action>
</package>
</struts>
然后,我们增加add方法
package cn.encore.action;
import cn.encore.bean.*;
public class RapperAction {
private Rapper rapper;
public String show() {
rapper = new Rapper();
rapper.setName("王闪火");
return "show";
}
public String add(){
System.out.println("rapper.name:"+rapper.getName());
return "show";
}
public Rapper getRapper() {
return rapper;
}
public void setRapper(Rapper rapper) {
this.rapper = rapper;
}
}
然后我们访问http://localhost:8080/struts2/addRapper.jsp这个路径,在我们提交表单时,会转到action中的show方法中,并把我们提交的内容显示出来
访问流程就是,我们先访问我们自己编写的addRapper.jsp这个网页,当我提交表单时,网页会访问addRapper这个路径,而我们配置的Filter会做拦截,并把这项任务交给struts来处理,struts会在struts.xml中读取如何处理这个请求,我们配置的是交给add方法处理,在add方法执行之前Struts会生成一个Rapper对象,并把传递过来的值赋给这个对象,接着通过SetRapper方法把这个对象注入RapperAction中,然后转交给show方法,来处理这个请求
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
正常显示中文
可能之前的操作,有的小伙伴在输入英文时,程序准确无误,可是在输入中文时,程序会造成乱码现象,解决这个问题的原理就是保证输入端和输出端保证相同的编码集
首先,我们要确保JSP提交的中文编码,在JSP页面首行加上:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
然后,我们要Struts中使用UTF-8来解码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="basicstruts" extends="struts-default">
<action name="showRapper" class="cn.encore.action.RapperAction" method="show">
<result name="show">show.jsp</result>
</action>
<action name="addRapper" class="cn.encore.action.RapperAction" method="add">
<result name="show">show.jsp</result>
</action>
</package>
</struts>
看到,多了一行:<
constant
name
=
"struts.i18n.encoding"
value
=
"UTF-8"
></
constant
>,这是声明Struts的解码集
这样,我们就可以正常的显示中文了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
log4g
在struts中,是默认关闭日志的,这对于我们来说,想要定位错误是十分困难并且头痛的,在这里,我们需要借助log4j这个JAR包,之前我分享的资源已经把log4j捆绑到里面了,使用我的资源可以直接使用,没有的话可以百度下载一个log4j的JAR包
然后,我们只需要在src目录下配置一个log4j.xml文件,就可以使用了
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/>
</layout>
</appender>
<!-- specify the logging level for loggers from other libraries -->
<logger name="com.opensymphony">
<level value="DEBUG" />
</logger>
<logger name="org.apache.struts2">
<level value="DEBUG" />
</logger>
<!-- for all other loggers log only debug and above log messages -->
<root>
<priority value="INFO"/>
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
使用log4j会使我们的服务器启动变慢,想要关闭log4j最简单的办法就是,把log4j.xml随便改一个其他的名字,等想用时再改回来就可以了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果想要获取原生的request,response也是可以做到的,相应方法如下
import
org.apache.struts2.ServletActionContext;
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
是借助ServletActionContext这个类得到的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struts中的session有两个,一个是传统原生的session,还有一个Struts自己定义的,要获取到Struts定义的session方法如下
import
com.opensymphony.xwork2.ActionContext;
Map m = ActionContext.getContext().getSession();
可以到看到,我们获得到一个Map类型的类,我们只需要往这个Map中Put进值,在jsp页面中就可以通过EL表达式,通过Key来获取值了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~调试
有个工具struts2-config-browser-plugin-2.2.3.1.jar,去网上下载这个包,然后访问http://localhost:8080/struts2/config-browser/actionNames这个路径,可以在网页中查看我们配置了哪些action,注意8080后跟的struts是我的项目名,如果不同情切换到你自己的项目名就可以运行成功
还有一个比较牛逼的调试工具是struts自带的,这里涉及到了struts的标签库相关的知识,我会在后续整理,就是struts的debug标签,他可以查看你通过action传过来的值有没有准确到达
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~通配符匹配
学到目前为止,我们配置show,add的ACTION,一个真正的应用程序不可能就这点方法,如果配置大量的设置会很麻烦,这里Struts为我们提供了通配符匹配的方式
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="basicstruts" extends="struts-default">
<action name="*Rapper" class="cn.encore.action.RapperAction" method="{1}">
<result name="show">show.jsp</result>
<result name="add">add.jsp</result>
</action>
</package>
</struts>
这里会把所有后缀是Rapper的路径匹配到这个配置来执行,method="{1}"表示要替换的是*Rapper里的*,当访问showRapper十转到show方法,当访问addRapper十转到add方法
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
struts默认使用的都是服务器跳转304,如果想要使用客户端跳转302,只需要在result标签中添加type
=
"redirect"这个属性就可以了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在默认设置下,Action是多实例的,每次访问都会创建新的Action实例
以上就是Struts的基础知识,消化完这些,可以继续深入理解Struts的原理,以及Struts提供的注解配置,标签等等各种特性