1、Struts2 核心是一个filter,该filter会拦截所有请求,
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-name>struts2</filter-name> <!-- 根据<filter-name> 找到对应的<!-- <filter-class>对应的类 StrutsPrepareAndExecuteFilter中 -->
<url-pattern>/*</url-pattern> <%@ page contentType="text/html;charset=GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"%>
<%@ taglib prefix="btn" uri="http://www.isoftstone-ai.org/BtnRight"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<meta http-equiv="Pragma" content="no-cache">
<title>学生信息查询</title>
<style type="text/css">
<!--
@import url("<%=request.getContextPath()%>/newcss/main.css");
-->
</style>
<script type="text/javascript"
src="<%=request.getContextPath()%>/js/common.js"></script>
<script type="text/javascript"
src="<%=request.getContextPath()%>/js/export.js"></script>
<script type='text/javascript'
src='<%=request.getContextPath()%>/cm_dwr/interface/funcDWR.js'></script>
<script type='text/javascript'
src='<%=request.getContextPath()%>/cm_dwr/engine.js'></script>
<script type='text/javascript'
src='<%=request.getContextPath()%>/cm_dwr/util.js'></script>
<script language="javascript">
<!--
var msg = '<fmt:message key="${message}"/>';
var errMsg = '<c:out value='${error}'/>';
if(errMsg != ''){
alert("<fmt:message key="${error}"/>");
}
if(msg != '' && msg!='??????' ){
alert(msg);
<c:remove var="message"/>
}
-->
</script>
</head>
<body onLoad="getFuncNme();">
<form name="pageform" id="pageform" method="post"
action="<%=request.getContextPath()%>/StudentController.do?cmd=queryList">
<div class="rightbox">
<div class="top">
<div class="lev1">
<div class="lev2">
<div class="lev3">
<h5 id="functionNme"></h5>
<span>
<button name="query_result" onClick="javascript:pageform.submit();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">查询<div></div></button>
<button name="btn15" onClick="javascript:doAdd();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">增加<div></div></button>
<button name="btn152" onClick="javascript:viewForUpdate();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">编辑<div></div></button>
<button name="btn153" onClick="javascript:doDel();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">删除<div></div></button>
<button name="btn153422" onClick="doReset();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">重置<div></div></button>
<button name="btn153422" onClick="exports('tableList','导出文件');"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">导出<div></div></button>
</span>
</div>
</div>
</div>
</div>
<div class="mid">
<div class="lev1">
<div class="lev2">
<div class="lev3">
<table class="search" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>学生代码:
<input name="studentCode" value="<c:out value="${pageInfo.studentCode}"/>" />
</td>
<td>学生姓名:
<input name="studentName" value="<c:out value="${pageInfo.studentName}"/>" />
</td>
</tr>
<tr>
<td>学生年龄:
<input name="studentAge" value="<c:out value="${pageInfo.studentAge}"/>" />
</td>
<td>学生专业:
<input name="studentMajor" value="<c:out value="${pageInfo.studentMajor}"/>" />
</td>
</tr>
</table>
<table class="maintable" border="0" cellspacing="0" cellpadding="0" id="tableList">
<tr>
<th nowrap width="3%">序号</th>
<th nowrap width="10%">学号</th>
<th nowrap width="10%">姓名</th>
<th nowrap width="15%">年龄</th>
<th width="30%" >专业<br></th>
<th nowrap width="5%">状态</th>
</tr>
<c:forEach items="${list}" varStatus="state" var="dto">
<c:if test="${state.count%2 == 1}">
<tr class="td1" onClick="selectThis(this);setCdeValue('<c:out value="${dto.studentCode}"/>');">
<td >
<c:out value="${state.count}" />
</td>
<td nowrap>
<c:out value="${dto.studentCode}" />
</td>
<td nowrap>
<c:out value="${dto.studentName}" />
</td>
<td nowrap>
<c:out value="${dto.studentAge}" />
</td>
<td class="td1">
<c:out value="${dto.studentMajor}" />
</td>
<td nowrap>
<c:out value="${dto.state}" />
</td>
</tr>
</c:if>
<c:if test="${state.count%2 == 0}">
<tr class="td2" onClick="selectThis(this);setCdeValue('<c:out value="${dto.studentCode}"/>');">
<td>
<c:out value="${state.count}" />
</td>
<td nowrap>
<c:out value="${dto.studentCode}" />
</td>
<td nowrap>
<c:out value="${dto.studentName}" />
</td>
<td nowrap>
<c:out value="${dto.studentAge}" />
</td>
<td>
<c:out value="${dto.studentMajor}" />
</td>
<td nowrap>
<c:out value="${dto.state}" />
</td>
</tr>
</c:if>
</c:forEach>
</table>
</div>
</div>
</div>
</div>
<div class="bottom">
<div class="lev1">
<div class="lev2">
<div class="lev3">
<c:out value="${pageInfo.html}" escapeXml="false" />
</div>
</div>
</div>
</div>
</div>
</form>
</body>
</html>
<script type="text/javascript">
<!--
var sUserCde = '';
function setCdeValue(cId){
sUserCde = cId;
}
function viewForUpdate(){
if(sUserCde==''){
alert("请选择一条记录");
return;
}
modalWindow('<%=request.getContextPath()%>/StudentController.do?cmd=queryInfo&act=update&key='+sUserCde,800,350);
}
function doDel(){
if(sUserCde==''){
alert("请选择一条记录");
return;
}
if(confirm("确定要删除吗?")){
pageform.userCde.value = sUserCde;
pageform.action = '<%=request.getContextPath()%>/StudentController.do?cmd=del';
pageform.submit();
}
}
function doAdd(){
modalWindow('<%=request.getContextPath()%>/turningController.do?cmd=user_info&act=save',800,350);
}
function doReset(){
pageform.userCde.value="";
pageform.userNme.value="";
pageform.state.value="";
pageform.subDept.value="";
pageform.dept.value="";
}
function getFuncNme(){
funcDWR.getFuncNme('<c:out value="${sessionScope.functionCde_}"/>',function(args){
document.getElementById("functionNme").innerHTML=args;
});
}
//-->
</script>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"%>
<%@ taglib prefix="btn" uri="http://www.isoftstone-ai.org/BtnRight"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<meta http-equiv="Pragma" content="no-cache">
<title>学生信息查询</title>
<style type="text/css">
<!--
@import url("<%=request.getContextPath()%>/newcss/main.css");
-->
</style>
<script type="text/javascript"
src="<%=request.getContextPath()%>/js/common.js"></script>
<script type="text/javascript"
src="<%=request.getContextPath()%>/js/export.js"></script>
<script type='text/javascript'
src='<%=request.getContextPath()%>/cm_dwr/interface/funcDWR.js'></script>
<script type='text/javascript'
src='<%=request.getContextPath()%>/cm_dwr/engine.js'></script>
<script type='text/javascript'
src='<%=request.getContextPath()%>/cm_dwr/util.js'></script>
<script language="javascript">
<!--
var msg = '<fmt:message key="${message}"/>';
var errMsg = '<c:out value='${error}'/>';
if(errMsg != ''){
alert("<fmt:message key="${error}"/>");
}
if(msg != '' && msg!='??????' ){
alert(msg);
<c:remove var="message"/>
}
-->
</script>
</head>
<body onLoad="getFuncNme();">
<form name="pageform" id="pageform" method="post"
action="<%=request.getContextPath()%>/StudentController.do?cmd=queryList">
<div class="rightbox">
<div class="top">
<div class="lev1">
<div class="lev2">
<div class="lev3">
<h5 id="functionNme"></h5>
<span>
<button name="query_result" onClick="javascript:pageform.submit();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">查询<div></div></button>
<button name="btn15" onClick="javascript:doAdd();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">增加<div></div></button>
<button name="btn152" onClick="javascript:viewForUpdate();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">编辑<div></div></button>
<button name="btn153" onClick="javascript:doDel();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">删除<div></div></button>
<button name="btn153422" onClick="doReset();"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">重置<div></div></button>
<button name="btn153422" onClick="exports('tableList','导出文件');"
class="button_link" onMouseOver="this.className='button_hover'" οnmοuseοut="this.className='button_link'">导出<div></div></button>
</span>
</div>
</div>
</div>
</div>
<div class="mid">
<div class="lev1">
<div class="lev2">
<div class="lev3">
<table class="search" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>学生代码:
<input name="studentCode" value="<c:out value="${pageInfo.studentCode}"/>" />
</td>
<td>学生姓名:
<input name="studentName" value="<c:out value="${pageInfo.studentName}"/>" />
</td>
</tr>
<tr>
<td>学生年龄:
<input name="studentAge" value="<c:out value="${pageInfo.studentAge}"/>" />
</td>
<td>学生专业:
<input name="studentMajor" value="<c:out value="${pageInfo.studentMajor}"/>" />
</td>
</tr>
</table>
<table class="maintable" border="0" cellspacing="0" cellpadding="0" id="tableList">
<tr>
<th nowrap width="3%">序号</th>
<th nowrap width="10%">学号</th>
<th nowrap width="10%">姓名</th>
<th nowrap width="15%">年龄</th>
<th width="30%" >专业<br></th>
<th nowrap width="5%">状态</th>
</tr>
<c:forEach items="${list}" varStatus="state" var="dto">
<c:if test="${state.count%2 == 1}">
<tr class="td1" onClick="selectThis(this);setCdeValue('<c:out value="${dto.studentCode}"/>');">
<td >
<c:out value="${state.count}" />
</td>
<td nowrap>
<c:out value="${dto.studentCode}" />
</td>
<td nowrap>
<c:out value="${dto.studentName}" />
</td>
<td nowrap>
<c:out value="${dto.studentAge}" />
</td>
<td class="td1">
<c:out value="${dto.studentMajor}" />
</td>
<td nowrap>
<c:out value="${dto.state}" />
</td>
</tr>
</c:if>
<c:if test="${state.count%2 == 0}">
<tr class="td2" onClick="selectThis(this);setCdeValue('<c:out value="${dto.studentCode}"/>');">
<td>
<c:out value="${state.count}" />
</td>
<td nowrap>
<c:out value="${dto.studentCode}" />
</td>
<td nowrap>
<c:out value="${dto.studentName}" />
</td>
<td nowrap>
<c:out value="${dto.studentAge}" />
</td>
<td>
<c:out value="${dto.studentMajor}" />
</td>
<td nowrap>
<c:out value="${dto.state}" />
</td>
</tr>
</c:if>
</c:forEach>
</table>
</div>
</div>
</div>
</div>
<div class="bottom">
<div class="lev1">
<div class="lev2">
<div class="lev3">
<c:out value="${pageInfo.html}" escapeXml="false" />
</div>
</div>
</div>
</div>
</div>
</form>
</body>
</html>
<script type="text/javascript">
<!--
var sUserCde = '';
function setCdeValue(cId){
sUserCde = cId;
}
function viewForUpdate(){
if(sUserCde==''){
alert("请选择一条记录");
return;
}
modalWindow('<%=request.getContextPath()%>/StudentController.do?cmd=queryInfo&act=update&key='+sUserCde,800,350);
}
function doDel(){
if(sUserCde==''){
alert("请选择一条记录");
return;
}
if(confirm("确定要删除吗?")){
pageform.userCde.value = sUserCde;
pageform.action = '<%=request.getContextPath()%>/StudentController.do?cmd=del';
pageform.submit();
}
}
function doAdd(){
modalWindow('<%=request.getContextPath()%>/turningController.do?cmd=user_info&act=save',800,350);
}
function doReset(){
pageform.userCde.value="";
pageform.userNme.value="";
pageform.state.value="";
pageform.subDept.value="";
pageform.dept.value="";
}
function getFuncNme(){
funcDWR.getFuncNme('<c:out value="${sessionScope.functionCde_}"/>',function(args){
document.getElementById("functionNme").innerHTML=args;
});
}
//-->
</script>
<!-- 拦截所有请求 -->
</filter-mapping>
3、配置Struts.xml文件
<struts>
<!—package 用户配置action的组织包名,用于对Action进行归类 -->
<package name="first" namespace="/first" extends="struts-default">
<!—配置当前action 访问路径,以及对应的action类和调用的方法 -->
<action name="HelloWorld" class="cn.itcast.action.HelloWorldAction" method="sayHello" >
<!— 配置处理结果,继承struts-default包,默认结果处理类型为 dispatcher -->
<result name="success">/WEB-INF/hello.jsp</result>
</action>
</package>
</struts>
(1)<package>元素:
name 包名,用于被继承
namespace 配置访问路径
extends 指定继承的包
(2)<action>元素属性:
name 配置浏览器访问的路径名称 访问路径格式为:localhost:8080/项目名/<package>标签name/<action>标签的name/
后缀默认为 action和”” 可以通过常量进行配置,后缀名如果有多个用","分隔
<constant name="struts.action.extension" value="do"></constant>
class 访问的具体的类 如果继承struts-default 包,默认class 为ActionSupport,该类的 execute方法默认返回 "success"
我们在写 Action 类时通常会选择继承ActionSupport,也就自动继承了 execute 方法,同时可以使用父类定义的常量 SUCCESS、ERROR 等
method 访问类中的具体方法 不写默认执行execute方法
(3)<result>标签属性
name 访问的方法返回的字符串的值
(4) 通配符映射
一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系
通配符的映射规则
若找到多个匹配, 没有通配符的那个将胜出
若指定的Action不存在, Struts 将会尝试把这个URI与任何一个包含着通配符 * 的Action名及进行匹配
若 Struts 找到的带有通配符的匹配不止一个, 最后一个匹配将胜出
被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…
* 可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 \.
例:
<action name="*_add" class="cn.itcast.action.Girl" method="add"></action>
匹配路径 Boy_add.action Girl_add.action
<action name="Boy_*_*" class="cn.itcast.action.Boy" method="{1}">
<result name="success">
<param name="location">/WEB-INF/jsp/{2}.jsp</param>
</result>
</action>
Boy_add_delete 会调用 Boy的add方法, 转发给 delete.jsp
4、写一个javaBean 文件 标准的set get方法
5、新建一个action文件
创建一个action的类继承
ActionSupport 以及实现
ModelDriven<带上JavaBean泛型> 类
重写
ActionSupport 类的
execute()方法 以及
ModelDriven 类的
getModel()方法
getModel()的固定写法:
private
PersonBean
person
;
public
PersonBean getModel() {
this
.
person
=
new
PersonBean();
return
person
;
}
里面的方法都要用string类型的返回值
返回的字符串用作Struts.xml文件中的<result>标签的name属性的值,从而定向到相应的页面
<
action
name
=
"personAdd"
class
=
"com.ldl.person.PersonAction"
method
=
"personAdd"
>
<
result
name
=
"personView"
>
/personView.jsp
</
result
>
</
action
>
6、创建jsp页面
在页面上可以通过el表达式直接获取action文件中的值 通过页面提交的数据也能在action文件中直接获取