第03章 Struts2应用 课堂
struts2-课堂笔记案例

目录第一章框架技术 (2)struts2框架 (2)struts2的基本流程: (2)struts2中产生作用域 (3)上课实例: (3)一、模拟向数据库添加对象 (3)二、模拟登陆效果 (4)三、struts2中产生作用域 (5)四、实现加减乘除效果 (5)五、从数据读出数据加载到表格,并实现增删改 (6)六,在案例五的基础上实现分页 (10)七、在struts2 中使用传统 servlet (11)第二章标签库 (12)list 用法 (12)上课实例: (13)一、基本标签使用 (13)二、上传文件 (14)三、下载文件 (15)四、s:iterator以及s:if用法 (16)第三章验证框架与拦截器 (17)验证框架 (17)使用验证框架的步骤 (18)规则: (18)正则表达式 (18)避免对ShwAction中的所有方法进行过滤 (19)上课实例: (19)一、对单一 add()方法进行过滤 (19)二、对某一类方法进行过滤 (20)拦截器 (21)上课实例: (22)一、通过扩展拦截器,实现权限控制 (22)配置拦截器 (24)第四章作用域 token 图表 (25)作用域 (25)在struts2里面怎么实现类之间的跳转 (25)Token 令牌 (26)上课案例: (26)struts----图表 (27)第五章 Stuts2中 dwr,JQuery用法 (29)一、DWR使用 (29)上课案例:DWR使用 (29)二、JQuery使用 (30)上课案例:一、利用JQuery 传值 (30)上课案例:二、利用JQuery 返回字符串、对象、集合(JSON用法1) (31)上课案例:三、利用JQuery 返回字符串、对象、集合(JSON用法2) (32)第一章框架技术framework----框架什么是框架?它有什么用?答:框架是一个应用程序半成品,在框架的基础上加自己的业务逻辑代码就可以形成最终的应用程序接下来要学习的有哪些框架?struts2 > hibernate > ibatis > spring使用框架的好处是,框架可以帮助完成一些辅助性的工作,让程序员专注于编写业务逻辑struts2框架它是一个作为"表示层"的框架,它的主要作用是与用户交互,它的作用与servlet相似struts2其实是集成两种框架技术的优点,形成的一种新的框架: struts1 + webworkstruts2 = struts1 + webwork---------------------------------------------------------------------以前编写web程序,主要使用servlet做为核心控制器采用struts2编写web程序,主要是使用 Filter(过滤器)+Interceptor(拦截器)作为控制器struts2的基本流程:1、创建web工程2、导入struts2的框架支持3、编写index.jsp页面<jsp:forward page=”abcd!execute.action” />4、编写一个BaseAction类,用来封装属性,产生请求与响应5、编写ShwAction类中编写方法public String execute(){System.out.println("...............");return "yes";}6、编写show.jsp用于显示跳转以后的页面7、在struts.xml中编写代码,将jsp与类关联起来<struts><package name="struts2" extends="struts-default"><action name="abcd" class="org.java.web.ShwAction"><result name="yes">/show.jsp</result></action></package></struts>8、在web.xml中配置文件<dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><filter-mapping><filter-name>struts2</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping>----------<result name="success"> 不写默认为successstruts2框架所有的功能都是由一组过滤器与拦截器提供功能,这些过滤器与拦截器如果不加载,系统就没有任何功能系统所必须的一组过滤器与拦截器都封装一个名为 "struts-default"的包里面我们编写的package如果继承于struts-default这个包,在启动服务器的时候,这个包里面的过滤器以及拦截器才能加载到内存中,struts2才会有功能------------------------------------------------如果请求在进入action的时候,没有指定要进入哪一个方法,系统就会默认调用execute,如果方法不存在,就直接出错--------------------在提交表单的时候,表单中的数据,默认会自动存储到请求作用域中------------------------------------------request.setAttribute("uname",值);request.setAttribute("uage",值);将实体类作为属性来填充数据----------------------------------action类中的每一个方法,get与post都可以进入<result name=""> name属性默认值是: success---------------------------struts2的默认编码格式为 UTF-8,只要改为"gbk",就可以解决乱码文件struts2的所有默认的属性配置都在: default.properties文件中------------------------------------------------------------------要更改默认属性有两种方式:第一种方式: 在struts.xml文件编写如下代码:<constant name="struts.i18n.encoding"value="gbk"></constant>-----------------------------------------------------------------struts2中产生作用域的方式有四种:第一种: 让BaseAction实现 ServletRequestAwarepublicclass BaseAction implements ServletRequestAware{protected HttpServletRequest req;protected HttpSession ses;publicvoid setServletRequest(HttpServletRequest request) {this.req=request;this.ses=req.getSession();}--------------------------------------------------------------在struts2中,一个action类,默认可以包含多个方法,如果在进入action时,没有指定要访问哪一个方法,系统将默认调用 execute execute是默认访问的方法如果要访问类中的指定方法,格式如下:请求名称!方法名称.actionreg!test.actionreg!search.action--------------------------------------------------在struts2中,要使用jsp:forward必须在web.xml文件中,做如下配置<filter-mapping><filter-name>struts2</filter-name><url-pattent>*.action</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping>上课实例:一、模拟向数据库添加对象1、创建web工程2、导入struts2的框架支持3、编写一个实体类Infpublic class Inf implements Serializable {private Integer id;private String name;private Integer age;4、编写jsp页面<form action="login.action">编号:<input type="text" name="f.id"/><Br/>姓名:<input type="text" name=""/><Br/>年龄:<input type="text" name="f.age"/><Br/><input type="submit" value="提交"/></form>5、编写一个Dao类,添加一个添加的方法public class Dao {public void add(Inf f){System.out.println("向数据库添加了一条数据:");System.out.println("编号:"+f.getId());System.out.println("姓名:"+f.getName());System.out.println("年龄:"+f.getAge());}}6、编写一个BaseAction类,封装Inf类,public class BaseAction {protected Inf f;public Inf getF() {return f;}public void setF(Inf f) {this.f = f;}}7、编写一个LoginAction,充当控制器(起到servlet的作用)public class LoginAction extends BaseAction{private Dao dao = new Dao();public String execute() {dao.add(f);return "ok";}}8、编写show.jsp用于显示跳转以后的页面<body>登录成功<hr/>编号: ${f.id}<Br/>姓名: ${}<Br/>年龄: ${f.age}<Br/></body>9、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="login" class="org.java.web.LoginAction"><result name="ok">/show.jsp</result></action></package>二、模拟登陆效果1、创建web工程2、导入struts2的框架支持;3、编写jsp页面<form action="login.action" method="post">用户名:<input type="text" name="uname"/>密码:<input type="text" name="upwd"/><input type="submit" value="登录"></form>4、编写一个BaseAction类public class BaseAction {protected String uname;protected String upwd;}5、编写一个LoginAction,充当控制器(起到servlet的作用)public String execute(){if(uname.equals("jack")&&upwd.equals("123")){return "success";}else{return "error";}}6、编写ok.jsp err.jsp用于显示跳转以后的页面7、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="login" class="org.java.web.LoginAction"><result name="success">/ok.jsp</result><result name="error">/err.jsp</result></action></package>三、struts2中产生作用域1、创建web工程2、导入struts2的框架支持;3、编写jsp页面<form action="reg.action" method="post">姓名:<input type="text" name="uname"/><Br/>年龄:<input type="text" name="uage"><Br/><input type="submit" value="提交"></form>4、编写一个BaseAction类,产生请求作用域,publicclass BaseAction implements ServletRequestAware{ protected HttpServletRequest req;protected HttpSession ses;publicvoid setServletRequest(HttpServletRequest request) { this.req=request;this.ses=req.getSession();}5、编写一个ShwAction,充当控制器(起到servlet的作用)public String execute(){req.setAttribute("mess","这是请求中的消息....");ses.setAttribute("ses","这是session的消息");return "success";}6、编写show.jsp用于显示跳转以后的页面<body>姓名:${requestScope.uname}<Br/>年龄:${requestScope.uage}<hr/>请求:${requestScope.mess }<Br/>会话:${sessionScope.ses }</body>7、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="reg" class="org.java.web.ShwAction"><result>/show.jsp</result></action></package>四、实现加减乘除效果1、创建web工程2、导入struts2的框架支持;3、编写jsp页面<form action="calculate!add.action" name="myfrm">第一个数:<input type="text" name="one"/><Br/>第二个数:<input type="text" name="two"/><Br/><input type="submit" value="加法" onclick="op('add')"/><input type="submit" value="减法" onclick="op('subtr')"/><input type="submit" value="乘法" onclick="op('chen')"/><input type="submit" value="除法" onclick="op('chu')"/></form>编写函数<script type="text/javascript">function op(methodName){var frm = document.forms.myfrm;frm.action="calculate!"+methodName+".action";frm.submit();//手动提交表单}</script>4、编写一个BaseAction类,封装Inf类,public class BaseAction implements ServletRequestAware{protected HttpServletRequest req;protected Integer one;protected Integer two;public void setServletRequest(HttpServletRequest request) {this.req=request;}5、编写一个LoginAction,充当控制器(起到servlet的作用)public class CalculateAction extends BaseAction {public String add(){Integer result = one+two;req.setAttribute("method","加法");req.setAttribute("result",result);return "success";}public String subtr(){Integer result = one-two;req.setAttribute("method","减法");req.setAttribute("result",result);return "success";}}6、编写show.jsp用于显示跳转以后的页面<hr/>第一个数: ${requestScope.one } <BR/>第二个数: ${requestScope.two } <br/>计算的方法:${requestScope.method }<Br/>计算的结果:${requestScope.result }<Br/><br/><A href="index.jsp">返回</A>7、在struts.xml中编写代码,将jsp与类关联起来<package name="struts" extends="struts-default"><action name="calculate" class="org.java.web.CalculateAction"> <result>/show.jsp</result></action></package>五、从数据库读出数据加载到表格,并实现增删改1、创建web工程2、导入struts2的框架支持,导入Oracle驱动3、编写一个实体类Infpublic class Inf implements Serializable {private Integer id;private String name;private Integer age;4、编写jsp页面<jsp:forward page="abc!load.action" />5、编写一个Dao类public List<Inf>getList(){List<Inf> list = new ArrayList<Inf>();try {String sql = "select * from inf2";pst = getConn().prepareStatement(sql);rs = pst.executeQuery();while(rs.next()){Inf f = new Inf();f.setId(rs.getInt("id"));f.setName(rs.getString("name"));f.setAge(rs.getInt("age"));list.add(f);}} catch (Exception e) {e.printStackTrace();}finally{close();}return list;}public void add(Inf f){try {String sql = "insert into inf2 values(inf_seq.nextval,?,?)";pst = getConn().prepareStatement(sql);pst.setString(1,f.getName());pst.setInt(2, f.getAge());pst.execute();} catch (Exception e) {e.printStackTrace();}finally{close();}}public void del(Integer id){try {String sql = "delete from inf2 where id=?";pst = getConn().prepareStatement(sql);pst.setInt(1,id);pst.execute();} catch (Exception e) {e.printStackTrace();}finally{close();}}public Inf findById(Integer id){try {String sql = "select * from inf2 where id="+id;pst = getConn().prepareStatement(sql);rs = pst.executeQuery();if(rs.next()){Inf f = new Inf();f.setId(id);f.setName(rs.getString("name"));f.setAge(rs.getInt("age"));return f;}} catch (Exception e) {e.printStackTrace();}finally{close();}return null;}public void update(Inf f){try {String sql = "update inf2 set name=?,age=? where id=?";pst = getConn().prepareStatement(sql);pst.setString(1,f.getName());pst.setInt(2,f.getAge());pst.setInt(3,f.getId());pst.execute();} catch (Exception e) {e.printStackTrace();}finally{close();}}6、编写一个BaseAction类,封装Inf类,并产生请求作用域public class BaseAction implements ServletRequestAware{ protected Dao dao = new Dao();protected HttpServletRequest req;protected Inf f = new Inf();public Inf getF() {return f;}public void setF(Inf f) {this.f = f;}public void setServletRequest(HttpServletRequest request) { this.req = request;}}7、编写一个 MyAction,充当控制器(起到servlet的作用)public String load(){List<Inf> list = dao.getList();req.setAttribute("list",list);return "success";}public String add(){dao.add(f);load();return "success";}public String del(){Integer id = Integer.parseInt(req.getParameter("id"));dao.del(id);load();//重新加载return "success";}public String update(){Integer id = Integer.parseInt(req.getParameter("id"));Inf f = dao.findById(id);req.setAttribute("k",f);return "update";}public String modify(){dao.update(f);load();return "success";}8、编写show.jsp用于显示跳转以后的页面<body><table align="center" width="60%" border="1"><Tr id=”first”><th>编号</th><th>姓名</th><th>年龄</th><th>编辑</th></Tr><c:if test="${not empty requestScope.list}"><c:forEach items="${requestScope.list}" var="t"><tr align="center"><Td>${t.id }</Td><Td>${ }</Td><Td>${t.age }</Td><Td><a href="add.jsp">添加</a> <a href="abc!del.action?id=${t.id }"onclick="return confirm('你确定要删除该数据吗?')">删除</a> <a href="abc!update.action?id=${t.id}">修改</a></Td></tr></c:forEach></c:if></table></body>9、编写add.jsp用于添加数据到数据库<form action="abc!add.action">姓名:<input type="text" name=""><Br/>年龄:<input type="text" name="f.age"><Br/><input type="submit" value="添加"/><input type="button" value="返回" onclick="history.back()"/> </form>10、编写update.jsp用于修改数据<form action="abc!modify.action" method="post"><br><input type="hidden" name="f.id" value="${k.id}">姓名:<input type="text" name="" value="${}"/><Br/>年龄:<select name="f.age"><c:forEach begin="1" end="120" var="v" ><c:if test="${v==k.age}"><option value="${v }" selected="selected">${v}岁</option></c:if><c:if test="${v!=k.age}"><option value="${v }">${v}岁</option></c:if></c:forEach></select><Br/><input type="submit" value="修改"><input type="button" value="返回" onclick="history.go(-1)"> </form>11、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="abc" class="org.java.web.MyAction"><result name="success">/show.jsp</result><result name="update">/update.jsp</result></action></package>12、在struts2中,要使用jsp:forward必须在web.xml文件中,做如下配置<filter-mapping><filter-name>struts2</filter-name><url-pattent>*.action</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping>13、建立 js 文件夹导入 jquery-1.5.2 ,编写my.js$(function(){$("tr:not(#first,#last)").mouseover(function(){$(this).css("background-color","lime");}).mouseout(function(){$(this).css("background-color","white");});$("tr:first").css("background-color","gray")});六,在案例五的基础上实现分页1、新建 Pagination类实现 Paginationpublic class Pagination implements Serializable {private Integer index = 1;// 当前页private Integer size = 3;// 每页三条private Integer maxCount;// 总数public Integer getMaxPage() {return maxCount % size == 0 ? maxCount / size : maxCount / size + 1;}}2、Dao 类中的查询所有数据的方法,以及得到总数的方法public List<Inf> findPage(Pagination p){List<Inf> list= new ArrayList<Inf>();try {//共总应该显示哪些rownumint total = p.getIndex()* p.getSize();//已经显示过的rownumint dona = (p.getIndex()-1)*p.getSize();String sql = "select * from (select rownum r,f.* from inf2 f whererownum<="+total+") t where t.r>"+ dona;pst = getConn().prepareStatement(sql);rs = pst.executeQuery();while(rs.next()){Inf f = new Inf();f.setId(rs.getInt("id"));f.setName(rs.getString("name"));f.setAge(rs.getInt("age"));list.add(f);}} catch (Exception e) {e.printStackTrace();}finally{close();}return list;}//查询数据表中的总记录数public Integer getMaxCount(){try {String sql = "select count(*) from inf2";pst = getConn().prepareStatement(sql);rs = pst.executeQuery();if(rs.next()){return rs.getInt(1);}} catch (Exception e) {e.printStackTrace();}finally{close();}return 0;}3、编写一个BaseAction类,产生会话作用域protected HttpSession ses;public void setServletRequest(HttpServletRequest request) {this.req = request;this.ses = request.getSession();}4、修改MyAction类中的load(),并添加分页显示的方法 change()public String load(){Pagination p = new Pagination();//分页对象//首先查询一共有几条数据,把信息保存到分页对象中Integer maxCount = dao.getMaxCount();//总记录数p.setMaxCount(maxCount);//把总数存到分页对象中List<Inf> list = dao.findPage(p);req.setAttribute("list",list);ses.setAttribute("p",p);//把分页信息存到session中return "success";}public String change(){Integer index= Integer.parseInt(req.getParameter("index"));//当前页Pagination p = (Pagination) ses.getAttribute("p");p.setIndex(index);//重设当前页List<Inf> list = dao.findPage(p);req.setAttribute("list",list);ses.setAttribute("p",p);//把分页信息存到session中return "success";}5、修改 show.jsp 在表格中添加一行显示分页信息<tr align="center" id="last"><Td colspan="4"><c:if test="${p.index==1}">首页 上一页 </c:if><c:if test="${p.index!=1}"><A href="abc!change.action?index=1">首页</A> <A href="abc!change.action?index=${p.index-1}">上一页</A> </c:if><c:if test="${p.index==p.maxPage}">下一页 尾页 </c:if><c:if test="${p.index!=p.maxPage}"><A href="abc!change.action?index=${p.index+1}">下一页</A> <A href="abc!change.action?index=${p.maxPage}">尾页</A> </c:if></Td></tr>七、在struts2 中使用传统 servlet1、创建web工程2、导入struts2的框架支持3、编写index.jsp页面<form action="shw!add.action" method="post">用户:<input type="text" name="uname"/><Br/>年龄:<input type="text" name="uage"/><Br/><input type="submit" value="提交 "></form>4、编写BaseAction,产生请求与响应public class BaseAction implements ServletRequestAware, ServletResponseAware { protected HttpServletRequest request;protected HttpServletResponse response;public void setServletRequest(HttpServletRequest req) {this.request = req;}public void setServletResponse(HttpServletResponse res) {this.response = res;}}5、编写一个ShwAction类,继承BaseAction,充当控制器(起到servlet的作用)public void add() throws Exception{response.setContentType("text/html;charset=gbk");String name = request.getParameter("uname");Integer age = Integer.parseInt(request.getParameter("uage"));request.setAttribute("name",name);request.setAttribute("age",age);//request.getRequestDispatcher("/show.jsp").forward(request, response);response.sendRedirect("");}6、编写show.jsp用于显示跳转以后的页面<body>姓名:${ }<Br/>年龄:${requestScope.age }<BR/></body>7、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="shw" class="org.java.web.ShwAction"/></package>第二章标签库要在页面中,使用struts2的标签库,首先需要导入标签指令<%@ taglib uri="/struts-tags" prefix="s"%>更改默认的编码格式:第一种方式: 在struts.xml文件配置如下代码:<constant name="struts.i18n.encoding" value="gbk">第二种方式: 在src目录下,创建一个属性文件: struts.properties,然后在文件中配置如下代码:struts.i18n.encoding=gbk如果这两种方式都配置,系统优先选择第二种方式list 用法第一种方式:<s:radio list="{'男','女'}" name="f.gender" value="'男'" label="性别"/> 这种方式表示: list中有两个选项,分别男和女,value用于设置默认值,它的默认值必须与其中的一个选项对应,真正被选中的值就是这两个选项中的一个第二种方式:<s:radio list="#{'male':'男','female':'女'}" name="f.gender" value="'male'" label="性别"/>list集合,在页面中绑定了一种键值对类型的数据,选中的是男或女,真正提交到后台的是male或female,······注意:前面应加上#号,另,设置默认值,只需要value与键相同即可第三种方式: 数据来自至于作用域 (map类型的集合)<s:radio list="%{#request.gender}"listKey="key"listValue="value"name="f.gender"value="'male'"label="性别"/>第四种方式: 数据来自至作用域 (List类型的集合,集合中放的是对象)<s:radio list="%{#request.list}"listKey="name"listValue="val"name="f.gender"value="'male'"label="性别"/>---注意:在struts2的标签中,传统的EL表达式都不允许使用要想在首页中使用 struts 标签必须在 web.xml 文件中配置如下<filter-mapping><filter-name>struts2</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping>上课实例:一、基本标签使用1、创建web工程2、导入struts2的框架支持3、编写index.jsp页面<%@ taglib uri="/struts-tags" prefix="s" %><body><jsp:forward page="shw!reg.action"/></body>4、编写一个Inf实体类public class Inf implements Serializable {private String name;//文本框private String pwd;//密码框private String gender;//单选按钮private Integer age;//下拉列表private String[] likes;//复选框private String remark;//文本域private Date regTime;//日历控件}5、编写一个BaseAction类,封装Inf类,以及产生请求作用域public class BaseAction implements ServletRequestAware{protected HttpServletRequest req;protected Inf f;}6、编写一个ShwAction类,充当控制器(起到servlet的作用)public String reg(){List<Gender> list = new ArrayList<Gender>();Gender g1 = new Gender();g1.setName("male");g1.setVal("男性");Gender g2 = new Gender();g2.setName("female");g2.setVal("女性");list.add(g1);list.add(g2);req.setAttribute("list",list);Map<Integer,String> ages = new TreeMap<Integer, String>();for(int i=1;i<121;i++){ages.put(i,i+"岁");}req.setAttribute("ages",ages);return "success";}public String register(){return "register";}7、编写reg.jsp用于提交用户信息<s:form action="shw!register.action"method="post"><s:textfield name=""label="用户名"/><s:password name="f.pwd"label="密码"size="21"maxLength="6"/><s:radio list="%{#request.list}"listKey="name"listValue="val"name="f.gender"value="'male'"label="性别"/><s:select list="%{#request.ages}"listKey="key"listValue="value"headerKey="-1"headerValue="请选择年龄"name="f.age"label="年龄"/><s:checkboxlist name="f.likes"list="{'足球','篮球','排球','台球'}"label="爱好"value="{'足球','台球'}"/><s:textarea name="f.remark"cols="20"rows="8"label="备注"/><s:submit value="注册"/></s:form>8、编写show.jsp用于显示跳转以后的页面<h1>注册信息如下</h1>姓名:${ }<Br/>密码:${f.pwd}<br/>性别:${f.gender }<Br/>年龄:${f.age }<Br/>爱好:<s:iterator value="%{#request.f.likes}"var="k">${k } </s:iterator><br/>备注:${f.remark }<Br/>注册时间:<s:date name="%{#request.f.regTime}"format="yyyy-MM-dd"/>9、在struts.xml中编写代码,将jsp与类关联起来<package name="struts2" extends="struts-default"><action name="shw" class="org.java.web.ShwAction"><result name="success">/reg.jsp</result><result name="register">/show.jsp</result></action></package>10、在src目录下,创建一个属性文件: struts.properties,然后在文件中配置如下代码:struts.i18n.encoding=gbk二、上传文件1、创建web工程2、导入struts2的框架支持3、编写index.jsp页面导入标签 <%@ taglib uri="/struts-tags" prefix="s"%><s:form action="shw!register.action"method="post"enctype="multipart/form-data"><s:textfield name="uname"label="姓名"/><s:file name="myfile"label="文件1"/><s:file name="myfile"label="文件2"/><s:file name="myfile"label="文件3"/><s:file name="myfile"label="文件4"/><s:submit value="提交"/></s:form>4、编写一个BaseAction类,产生文件public class BaseAction {protected File[] myfile;protected String[] myfileFileName;protected String uname;}。
STRUTS2的应用与讲解

struts.xml配置
当package中添加了namespace属性后,程序就会去匹配页面中的action值的 完整路径了。 上页的例子struts.xml中加入<package name="path1" namespace="/path1" ><package name="path2" namespace="path2">,JSP页面中的路径 <FORM action="wwww/test.action">就会找不到action,必须写成: <FORM action="path1/test.action">
案例前准备-struts.xml
struts.xml文件用于描述action,及连接器,导航,异常处理等信息。 是struts2应用的核心。 其中,采用了OO的思想,采用了包继承,命名空间,导入等机制。使 开发者更加容易上手
可以有多个package,package可以用来区分不同模块的action处理,extends属 性必须写,其值为struts-default,说明action的相关配置遵循strutsdefault.xml(内置的) 一个package中有多个action节点,action具体配置处理请求的类 子节点 result配置处理action后的导向地址,路径加"/"表示从webRoot目录 开始查找,不加“/”表示跳转到当前地址栏中目录下的指定文件 此配置访问时的路径是: 项目名/struts2/sum.action。 当action执行 后,return “negative” 或者 "positive" 如果result中不写name,则说明 return SUCCESS,就转向没有name的result中指 定的页面
struts2课堂笔记

struts2课堂笔记一、环境配置1、下载struts2所需包()2、解压空项目(apps/struts2-blank)3、复制项目中的web.xml(WEB-INF文件夹中),并修改web.xml起始默认页4、复制项目中lib(WEB-INF文件夹中)下面的所有包5、复制项目中的struts.xml(WEB-INF\classes文件夹中),留下xml的定义头、struts和package标签,其他的全部删除6、配置struts.xml的提示,window-references-xml Calalog-addLocation:struts-2.3.dtd所在路径(struts-2.3.3\src\core\src\main\resources)Key Type:URIKey:/dtds/struts-2.3.dtd7、新建action可以继承ActionSupport类或实现Action接口8、配置struts.xml,package标签中增加action标签,指定name属性(该属性为必填属性,别名的作用),可以指定class属性(class为选填属性,表示别名对应的action类)9、jsp页面可以直接使用上面配置的action的name属性值了(一般使用范围:form的action,a标记的href)二、struts.xml配置1、参考struts-2.3.3\src\core\src\main\resources\struts-2.3.dtd配置2、参考struts-2.3.3\src\core\src\main\resources\struts-default.xml配置result-types:action中结果类型的配置(很少用)interceptors:拦截器定义(下节重点)default-interceptor-ref:声明默认拦截器引用(下节重点)default-action-ref:声明默认actiondefault-class-ref:声明默认的classglobal-results:全局返回结果(常用于登陆或出错了)global-exception-mappings:全局异常处理action:action的配置(此节重点介绍)<action name="..." class="..." method="...">-action中方法名为execute时,此处method可以省略配置<result name="..." type="...">-action返回值为success时,此处name可以省略配置<param name="...">...</param></result></action>type:掌握chain,dispatcher(默认),redirect,redirectAction,stream内部转发(chain,dispatcher)重定向(redirect,redirectAction)跳转页面(dispatcher,redirect)跳转action(chain,redirectAction)三、校验框架校验execute方法(方法执行顺序:validate-execute)1、在action中编写validate方法2、如果验证出错了可以用:this.addFieldError("...","...");或this.addActionError("...");或this.addMessage("...");来增加错误提示3、前台JSP页面可以用<s:filederror filedName="..." />或<s:actionError />或<s:message />或EL表达式(${errors[0].name})4、如果action中增加错误,则action中的execute方法是不会执行的,并且会自动返回input,所有在struts.xml中配置action的时候一定要配置返回结果为input的类型校验自定义方法(方法执行顺序:validate-validateTest-test)1、如自定义方法名为test,则增加validateTest方法实现校验2、其他步骤和上面execute方法的校验一样3、注意事项(自定义校验注意方法名的大小写规范,注意方法的执行顺序)配置校验(action名-validation.xml)参考xwork-core-2.3.3.jar下的com.opensymphony.xwork2.validator.validators下的default.xml文件配置提示(见第1章):struts-2.3.3\src\xwork-core\src\main\resources\xwork-validator-1.0.2.dtd验证器说明required:验证非数字是否非空requiredstring:验证字符串字段是否非空int:验证是否为数字long:验证长数字short:验证短数字double:验证小数date:验证日期email:验证邮箱url:验证URL地址stringlength:验证字符串长度regex:验证正则表达式四、拦截器和Action通配拦截器编写与配置(参考struts-2.3.3\src\core\src\main\resources\struts-default.xml配置)1、拦截器编码新建拦截器类,实现Interceptor接口或继承AbstractInterceptor抽象类2、拦截器的定义在struts.xml中增加<interceptors>标签(参考第2章struts.xml配置)在<interceptors>标签中增加<interceptor name="..." class="...">标签3、拦截器栈的定义在<interceptors>标签中增加<interceptor-stack name="...">标签在<interceptor-stack name="...">标签中添加拦截器的引用(参考第4点)4、拦截器的引用在<action>标签下增加<interceptor-ref name="...">标签引用配置好的拦截器或拦截器栈5、默认拦截器增加<default-interceptor-ref name="...">标签引用拦截器或拦截器栈6、拦截器的执行顺序action中的拦截器-默认拦截器-继承的拦截器7、struts2提供的拦截器defaultStack:struts2提供的拦截器(配置了自定义拦截器之后,一定要把默认的拦截器加上,否则会导致struts2的很多功能无法使用)Action通配(*)配置Action的时候要注意约束规则(包括大小写)<action name="*_*" class="com.zit.action.{1}Action" method="{2}"><result><param name="location">{1}{2}success.jsp</param></result><result name="input"><param name="location">{1}{2}.jsp</param></result></action>提交的action别名:student_addaction类名:com.zit.action.studentActionmethod方法名:add成功页面:studentaddsuccess.jsp失败页面:studentadd.jsp五、OGNLOGNL表达式(<s:debug>标签的应用)1、Value Stack(可以直接访问,例:<s:property value="name" />)2、Action Context(访问时候需要加#号,例:<s:property value="#" />)掌握的三个符号#(1.访问非值栈的内容2.构造Map集合3.投影())%(和javascript中的eval用法类似)$(EL表达式所用)六、标签库需要掌握的标签:<s:property><s:date><s:debug><s:if><s:elseif><s:else><s:iterator><s:form><s:textfiled><s:password><s:hidden><s:radio><s:checkboxlist>七、上传下载上传文件1、编写页面代码参考struts2-core-2.3.3.jar\org.apache.struts2.interceptor\FileUploadInterceptor.class代码<form action="upload" method="post" enctype="multipart/form-data"><input type="file" name="file" /><input type="submit" value="上传" /></form>2、编写Actionpublic class UploadAction extends ActionSupport {//待上传的文件private File file;//文件名,注意命名private String fileFileName;//文件类型,注意命名private String fileContentType;@Overridepublic String execute() throws Exception {//获取项目所在根目录下的upload文件夹String path=ServletActionContext.getServletContext().getRealPath("/upload");//定义输入输出字节流InputStream is=null;OutputStream os=null;try {//指定待上传的文件is=new FileInputStream(file);//指定上传之后存放的路径os=new FileOutputStream(path+"//"+fileFileName);byte[] b=new byte[1024];int len=0;while((len=is.read(b, 0, 1024))>0){os.write(b, 0, len);}} catch (Exception e) {e.printStackTrace();}finally{os.close();is.close();}return SUCCESS;}//省略getter/setter}3、配置struts.xml<action name="upload" class="com.zit.action.UploadAction"><result><param name="location">index.jsp</param></result></action>配置上传文件限制大小(默认2M)参考:struts2-core-2.3.3.jar\org.apache.struts2\default.properties在package标签上面增加<constant name="struts.multipart.maxSize" value="2097152"></constant>,改变value值配置上传文件的临时存储空间<constant name="struts.multipart.saveDir" value="c://temp"></constant>上传文件注意事项:1、前台页面表单一定要修改属性enctype="multipart/form-data"和method="post"2、如果要使用多文件上传,修改上面action代码为数组类型(File[],String[]),下面用循环即可下载文件1、编写页面代码<form action="download" method="post" id="myform"><input type="hidden" name="name" id="myfile" /></form><s:iterator value="list" var="s"><div class="show" onclick="getName('<s:property value="s" />');"><s:property value="s" /></div></s:iterator>function getName(name){var myform=document.getElementById("myform");var myfile=document.getElementById("myfile");myfile.value=name;myform.submit();}2、编写Action代码public class DownLoadFileAction extends ActionSupport {private String name;public InputStream getInputStream() throws Exception{String path=ServletActionContext.getServletContext().getRealPath("/upload");return new FileInputStream(path+"//"+name);}public String getName() throws Exception {//转换编码return URLEncoder.encode(name,"utf-8");}public void setName(String name) { = name;}}3、配置struts.xml参考:struts2-core-2.3.3.jar/org.apache.struts2.dispatcher/StreamResult.class<action name="download" class="com.zit.action.DownLoadFileAction"><result type="stream">//${name}一定要和前台JSP中传递过来的名字保持一致<param name="contentDisposition">attachment;filename=${name}</param>//此参数的名字一定要和Action中的方法名保持一致,如:inputStream,action 中一定要有个方法叫做getInputStream<param name="inputName">inputStream</param></result></action>下载注意事项:1、下载文件编码问题(用post提交请求)2、配置文件和后台action的对应3、下载的时候配置文件中的结果类型要用stream。
Struts2框架教程及应用

Struts2配置 (1)Action接受请求参数 (6)拦截器 (10)OGNL表达式 (16)输入校验 (22)文件上传下载 (26)Struts2配置1、Struts2框架配置文件Struts2框架按照如下顺序加载struts2配置default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面struts-default.xml 该文件保存在 struts2-core-2.3.7.jarstruts-plugin.xml 该文件保存在struts-Xxx-2.3.7.jarstruts.xml 该文件是web应用默认的struts配置文件struts.properties 该文件是Struts的默认配置文件web.xml 该文件是Web应用的配置文件如果多个文件配置了同一个struts2 常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值2、Struts2常量配置∙指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的输出<constant name="struts.i18n.encoding" value="UTF-8"/>∙该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开<constant name="struts.action.extension" value="action"/>∙设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭<constant name="struts.serve.static.browserCache"value="false"/>∙当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开<constant name="struts.configuration.xml.reload" value="true"/>∙开发模式下使用,这样可以打印出更详细的错误信息<constant name="struts.devMode" value="true" />∙默认的视图主题<constant name="struts.ui.theme" value="simple" />∙与spring集成时,指定由spring负责action对象的创建<constant name="struts.objectFactory" value="spring" />∙该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。
Struts2课件

Sturuts2第一节、Struts2介绍Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
Struts2对Struts1进行了巨大的改进。
主要表现在如下几个方面: 在Action的实现方面:Struts1要求必须统一扩展自Action类,而Struts2中可以是一个POJO。
线程模型方面:Struts1的Action是单实例的,一个Action的实例处理所有的请求。
Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
Servlet依赖方面:Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。
这使程序难于测试。
Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
封装请求参数:Struts1中强制使用ActionForm对象封装请求的参数。
Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
表达式语言方面:Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph NavigationLanguage)。
绑定值到视图技术:Struts1使用标准的JSP,Struts2使用"ValueStack"技术。
struts2课堂学习笔记

话题一:Struts 简介1:Struts是由apache开源联盟提供的一套基于构建java web应用程序的框架,他的目标是分离web程序的表示层(view),控制层(control)和模型层(model),即mvc模式。
使程序员将更多的精力投入到后台的业务逻辑设计,而不是底层的web基础框架。
2:Struts的所有功能都是建立在已有的java web组件上,例如servlet,jsp或者java bean,它只是利用一种方式将这些元素组织起来,使他们协同工作。
并不是开发一种新的组件3:总之,struts只是mvc框架,用于快速开发java web应用,struts的核心重在C(Controller),包括中心控制器ActionServlet和我们定制的Action,也为V(View)提供了一些列的标签。
Struts几乎没有涉及到M(Model)除了actionform,所以struts可以采用java实现的任何形式的商业逻辑。
4:Mvc的优点:(1)所有的控制逻辑都在控制层,便于维护(从维护角度考虑)(2)使软件便于扩充(3)开发的速度快,成本低(4)分工清晰,使团队管理井井有条。
话题二:开发简单的struts应用1:web应用的配置文件web.xml,(主要配置struts提供的中心控制器ActionServlet)<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/j2ee" xmlns:xsi="/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-app_2_4.xsd"><servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><param-name>config</param-name>//可以不写,但是如果想要有多个struts配置文件,则用以下方式<param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-dis.xml</param-value></init-param><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping></web-app>2:书写ActionForm类public class LoginForm extends ActionForm {private String name;private String password;public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {ActionErrors errors=new ActionErrors();ActionMessage message=new ActionMessage(“name.errors”);errors.add(“name”,message);return errors;}public void reset(ActionMapping mapping, HttpServletRequest request) { //用于重置属性,主要是多选框的重置} }(1)ActionForm是表单数据的封装对象,主要是用来封装页面的form传过来的值。
struts2课堂笔记
一:struts2介绍Struts2是在WebWork2基础发展而来的。
和struts1一样,Struts2也属于MVC框架。
不过有一点大家需要注意的是:尽管Struts2和struts1在名字上的差别不是很大,但Struts2和struts1在代码编写风格上几乎是不一样的。
主要是因为struts2有以下优点:1 > 在软件设计上Struts2没有像struts1那样跟Servlet API和struts API有着紧密的耦合,Struts2的应用可以不依赖于Servlet API和struts API。
Struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计。
public class OrderListAction extends Action {public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception {}}2> Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。
3> Strut2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。
在Struts1中,如果我们要实现同样的功能,就必须向Struts1的底层实现BeanUtil 注册类型转换器才行。
4> Struts2提供支持多种表现层技术,如:JSP、freeMarker、Velocity等5> Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。
6> 提供了全局范围、包范围和Action范围的国际化资源文件管理实现二:搭建struts2开发环境搭建Struts2环境时,我们一般需要做以下几个步骤的工作:1》找到开发Struts2应用需要使用到的jar文件.2》编写Struts2的配置文件struts.xml ,该文件需要存放在WEB-INF/classes 下3》在web.xml中加入Struts2 MVC框架启动配置三:Action名称的搜索顺序获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action1.首先寻找namespace为/path1/path2/path3的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package 则转步骤3;2.寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package,则转步骤4;3.寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为test的action,如果仍然不存在这个package,就去默认的namaspace的package下面去找名字为test的action(默认的命名空间为空字符串“”),如果还是找不到,页面提示找不到action。
Struts2框架应用开发教程课程设计
Struts2框架应用开发教程课程设计概述本课程设计旨在介绍 Struts2 框架的应用开发。
在本课程设计中,我们将从Struts2 框架的基本概念开始,逐步深入介绍 Struts2 框架的应用开发,包括配置文件的编写、Action 的使用、拦截器的应用、数据验证和结果处理等方面。
通过本课程的学习和实践,学生可以掌握 Struts2 框架应用开发的技能。
实验环境•操作系统:Windows 10•编程环境:Eclipse•服务器环境:Tomcat 9.0•数据库:MySQL实验内容实验一 Struts2框架的概念与基本操作实验目的通过本实验,学生将了解 Struts2 框架的概念和基本操作,掌握 Struts2 框架应用开发的基本技能。
实验步骤1.下载 Struts2 框架,并放入 Eclipse 工作空间。
2.新建一个 Struts2 Web 项目,并进行相关配置。
3.在项目中创建一个 JSP 页面 index.jsp,并进行必要的代码编写。
4.在 web.xml 中配置 Struts2 过滤器和监听器,并进行必要的代码编写。
5.在 src 目录下创建一个 Action 类,并进行相关代码编写。
6.在 struts.xml 中配置 Action,并进行必要的代码编写。
7.运行项目,在浏览器上查看结果。
8.尝试修改 Action 类和 JSP 页面,观察结果的变化。
实验二 Struts2框架的高级应用实验目的通过本实验,学生将了解 Struts2 框架的高级应用,包括拦截器的应用、数据验证和结果处理等方面,掌握 Struts2 框架应用开发的高级技能。
实验步骤1.在实验一的基础上,创建一个新的 JSP 页面,用于输入用户信息。
2.在实验一的基础上,修改 Action 类,完成用户信息的处理,并进行数据验证。
3.配置 Struts2 拦截器,实现用户登录验证和权限控制。
4.在 struts.xml 中配置结果视图,实现用户信息显示和操作结果提示。
Struts2框架技术入门
8
Struts2的下载
9
10
11
下载Struts2时有以下选项:
(1)Full Distribution:struts-2.3.4.1-all.zip 这是Struts2的完整下载包,内容包括Struts2的核心类库、源代 码、文档、实例等,建议选择该选项。 (2)Example Applications:struts-2.3.4.1-apps.zip 该包只包含Struts2的实例,在完整版的Struts2下载包中已经包 含了该选项中所有实例。 (3)Essential Dependencies Only:struts-2.3.4.1-lib.zip 该包只包含Struts2的核心类库,在完整版的Struts2下载包中已 经包含了该选项中所有类库。 (4)Documentation:struts-2.3.4.1-docs.zip 该包只包含Struts2的相关文档,包括使用文档、参考手册和API 等,在完整版的Struts2下载包中已经包含了该选项中所有文 档。 (5)Source:struts-2.3.4.1-src.zip 该包只包含Struts2的源代码,在完整版的Struts2下载包中已经 包含了该选项中所有源代码。
4
1.1.1 Struts2的由来与发展
Struts是整合了当前动态网站技术中Srvlet、JSP、 JavaBean、JDBC、XML等相关开发技术基础之上 的一种主流Web开发框架,是一种基于经典MVC的 框架。采用Struts可以简化MVC设计模式的Web应 用开发工作,很好地实现代码重用,使开发人员从 繁琐的工作中解脱出来,来开发具有强扩展性的 Web应用。 Struts2是 Java Web项目开发中最经典的Web框架 技术,受到许多软件开发人员喜爱与追捧,是软件 企业招聘Java软件人才时要求必备的技能之一。
通过代码实例跟我学Struts2框架从入门到精通——如何应用Struts2框架中..
1.1如何应用Struts 2框架中的CheckboxInterceptor和prepare默认拦截器的应用实例1.1.1Struts 2框架中的CheckboxInterceptor默认拦截器的应用示例1、主要的功能此拦截器是针对checkbox表单控件的,当提交的表单里有checkbox时,默认情况下,如果没选中,提交的值是null;如果选中,提交的值是"true"。
CheckboxInterceptor的作用是当没选中checkbox时,提交一个指定的值,而不是null。
2、实现的原理你需要在页面中为每个checkbox指定一个名字为"__checkbox_"+checkbox名的hidden 控件,例如,如果表单有一个名为vip的checkbox,就需要一个名为__checkbox_vip的hidden。
默认的,这个事情不需要你来做,因为Struts2在checkbox的simple模板中已经为你做了,即下面这条语句:<input type="hidden" name="__checkbox_${?html}"value="${parameters.fieldV alue?html}"/>因此CheckboxInterceptor实现原理如下:当提交表单后,CheckboxInterceptor会在请求参数里查找名字以"__checkbox_"开头的参数,如果找到,继续在请求参数里找对应的checkbox参数,如果没找到(表示没有选中该checkbox),就给checkbox参数一个指定的值,默认的,这个值为"false"。
3、可以在struts.xml文件中为某个Action引用该拦截器时设置改变这个值如下示例是将其值改成"no":<interceptor-ref name="checkbox"><param name="uncheckedValue">no</param></interceptor-ref>默认情况下,请求每个action都会调用CheckboxInterceptor,因为在Struts2定义的默认拦截器defaultStack中包含了它。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1.2 Struts 2体系结构
₪ Struts 2的基本流程如下:
■ ① Web浏览器请求一个资源。 ■ ② 过滤器Dispatcher查找请求,确定适当的Action。 ■ ③ 拦截器自动对请求应用通用功能,如验证和文件上传等 操作。 ■ ④ Action的execute方法通常用来存储和(或)重新获得 信息(通过数据库)。 ■ ⑤ 结果被返回到浏览器。可能是HTML、图片、PDF或其 他。
12
3.2.1 简单Struts 2实例开发
₪ 7. 创建并配置struts.xml文件 ₪ 任何一个Struts 2程序都不能缺少struts.xml文件,它是 Struts 2运行的核心。右击src文件夹,选择【new】→ 【file】菜单项,在File name框中输入“struts.xml”,修 改后的代码如下:
Java EE应用技术基础
济南大学信息学院 刘鹍 liukun@
1
第3章 Struts 2应用
₪ 3.1 ₪ 3.2 ₪ 3.3 ₪ 3.4 ₪ 3.5 ₪ 3.6 ₪ 3.7 Struts 2概述 Struts 2基本应用及工作流程 Struts 2标签库应用 Struts 2拦截器 Struts 2国际化应用 Struts 2文件上传 Struts 2综合应用实例——添加学生信息
9
图3.2 添加Struts 2的Jar包
3.2.1 简单Struts 2实例开发
₪ 4. 修改web.xml文件 ₪ 打开项目中的WebRoot/WEB-INF/web.xml文件, 修改其代码如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="/xml/ns/javaee" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/xml/ns/javaee /xml/ns/JavaEE/web-app_2_5.xsd"> <filter> <filter-name>struts 2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts 2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
■ apps:包含基于Struts 2的示例应用,是学习Struts 2非常有用 的资料。 ■ docs:包含Struts 2的相关文档,如Struts 2快速入门、Struts 2 文档、API文档等内容。 ■ lib:包含Struts 2框架的核心类库,以及Struts 2的第三方插件 类库。 ■ src:包含Strutlter-name>struts2</filter-name>
<url-pattern>/*</url-pattern> </filter-mapping> ■ 可以看出,里面配置了一个过滤器,那么就先来介绍过滤器的使用。 ■ Filter过滤器是Java项目开发中的一种常用技术。它是用户请求和处理 程序之间的一层处理程序。它可以对用户请求和处理程序响应的内容进 行处理,通常用于权限控制、编码转换等场合。
13
3.2.1 简单Struts 2实例开发
₪ 8. 创建welcome.jsp ₪ 创建welcome.jsp,其步骤和上面创建hello.jsp类似,这 里不再重复叙述。其代码如下:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>struts 2应用</title> </head> <body> hello <s:property value="#"/>! </body> </html>
图3.3 运行界面
图3.4 运行成功界面
15
3.2.2 Struts 2工作流程及各种文件详解
₪ 1. Struts 2的工作流程 ₪ Struts 2框架中的配置文件struts.xml会起映射作 用,它会根据“*”来决定调用用户定义的哪个 Action类。例如在项目Struts 2.0中,请求为 struts.action,前面“*”的部分是“struts”,所 以在struts.xml中有个Action类的name为 “struts”,这表示该请求与这个Action来匹配, 就会调用该Action中class属性指定的Action类。 但是在Struts 2中,用户定义的Action类并不是 业务控制器,而是Action代理,其并没有和 Servlet API耦合。所以Struts 2框架提供了一系 列的拦截器,它负责将HttpServletRequest请求 中的请求参数解析出来,传入到用户定义的 Action类中。
7
3.2 Struts 2基本应用及工作流程
₪3.2.1 简单Struts 2实例开发 ₪1. 下载Struts 2框架 MyEclipse 6没有对Struts 2的支持,所以需要用户自己 下载Struts 2开发包。登录/下载 Struts 2完整版,本书使用的是Struts 2.0.14。将下载的Zip 文件解压缩,它是一个典型的Web结构。打开其文件夹, 里面包含以下4个文件:
14
3.2.1 简单Struts 2实例开发
₪ 9. 部署和运行 ₪ 启动Tomcat后,在浏览器中输入 “http://localhost:8080/Struts2.0/hello.jsp”,会看到如图 3.3所示的界面。当在输入框中输入“张三”时,会出现 如图3.4所示界面。如果输入“HelloWorld”,就会返回当 前页面。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default"> <action name="struts" class="org.action.StrutsAction"> <result name="success">/welcome.jsp</result> <result name="error">/hello.jsp</result> </action> </package> </struts>
16
3.2.2 Struts 2工作流程及各种文件详解
₪ 2. Struts 2中各种文件详解
■ (1)web.xml文件
后面的webapp标签中配置了下面这样一段:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping>
5
3.1.2 Struts 2体系结构
₪ Struts 2框架的应用着重在控制上。简单的流程是:页面 →控制器→页面。最重要的是控制器的取数据与处理后 传数据的问题。Struts 2的体系结构还可以参考图3.1, 更直观地展现出其流程。
图3.1 Struts 2体系结构
6
3.2 Struts 2基本应用及工作流程
2
3.1 Struts 2概述
3
3.1 Struts 2概述
₪ 3.1.1 MVC简介 MVC有以下优点:
■ ① 多个视图可以对应一个模型。 ■ ② 模型返回的数据与显示逻辑分离。 ■ ③ 应用被分隔为三层,降低了各层之间的耦合,提供 了应用的可扩展性。 ■ ④ 控制层的概念也很有效,由于它把不同的模型和不 同的视图组合在一起,完成不同的请求,因此控制层 可以说是包含了用户请求权限的概念。 ■ ⑤ MVC更符合软件工程化管理的精神。不同的层各 司其职,每一层的组件具有相同的特征,有利于通过 工程化和工具化产生管理程序代码。
10
3.2.1 简单Struts 2实例开发
₪ 5. 创建hello.jsp 选择【WebRoot】→【new】→【jsp】菜单项,在File Name中输入文件名“hello.jsp”,修改后的代码如下:
<%@ page language="java" pageEncoding="UTF-8"%> <html> <head> <title>struts 2应用</title> </head> <body> <form action="struts.action" method="post"> 请输入姓名:<input type="text" name="name"/><br> <input type="submit" value="提交"/> </form> </body> </html>