Struts(一)
===============================MVC====================================
MVC(Model View Controller)
1.Model:封装数据,进行业务处理,返回处理结果
2.View:展示界面
3.Controller:接受用户端请求,将模型和视图联系在一起以实现用户请求的功能
思路:
==============================Struts===============================
介绍:
1.Struts2是一个MVC框架。Struts1 + WebWork
2.Struts2兼容性好
3.http://struts.apache.org
步骤:
1.加载类库
2.配置Web.xml文件
3.开发视图层页面
4.开发控制层Action
5.配置struts.xml文件
6.部署、运行项目
a.加载的基本jar包:
struts2-core-xxx.jar Struts 2框架的核心类库
xwork-core-xxx.jar XWork类库,Struts 2的构建基础
ognl-xxx.jar Struts 2使用的一种表达式语言类库
freemarker-xxx.jar Struts 2的标签模板使用类库
javassist-xxx.GA.jar 对字节码进行处理
commons-fileupload-xxx.jar 文件上传时需要使用
commons-io-xxx.jar Java IO扩展
commons-lang-xxx.jar 包含了一些数据类型的工具类
b.配置Web.xml
1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class> 4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 5 </filter-class> 6 </filter> 7 8 <filter-mapping> 9 <filter-name>struts2</filter-name> 10 11 <!-- 将全部请求定位到指定的Struts2过滤器中 --> 12 <url-pattern>/*</url-pattern> 13 </filter-mapping>
Struts2访问Servlet API -- (即,登录成功后,使用session保存用户信息)
访问方式:
1.解耦
a.对Servlet API进行封装
提供了三个Map对象访问request、session、application作用域
b.通过ActionContext类获取这三个Map对象
1)Object get("request")
2)Map getSession()
3)Map getApplication()
2.耦合
a.通过ServletActionContext类获取Servlet API对象
1)ServletContext getServletContext()
2)HttpServletResponse getResponse()
3)HttpServletRequest getRequest()
4)通过request.getSession()获取session对象
b.通过xxx.setAttribute()和xxx.getAttribute() 功能,在不同的页面或Action中传递数据
数据校验:
1.继承ActionSupport类来完成Action开发
validate()方法
2.ActionSupport类不仅对Action接口进行简单实现,同时增加了验证、本地化等支持
范例:
1.index.jsp
1 <%-- 引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%-- 引入JSTL标签指令 --%> 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 <head> 9 <meta charset="utf-8"> 10 <!-- 设置浏览器渲染的引擎 --> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 <!-- 设置支持移动设备 --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <title>网页标题</title> 15 <!-- 引用bootstrap样式 --> 16 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 17 </head> 18 <body> 19 <!-- 从session中读取数据 --> 20 ${sessionScope.loginUser } 21 22 ${msg } 23 <div class="container-fluid"> 24 <form action="hello" method="post"> 25 请输入内容:<input name="msg" type="text" /> 26 请输入内容:<input name="address" type="text" /> 27 <input type="submit" value="提交"/> 28 </form> 29 </div> 30 31 <!-- 引用外部JS文件 --> 32 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 33 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 34 35 </body> 36 </html>
2.HelloJspAction类
1 package com.Elastic.StrutsDemo1.ivy.action; 2 import com.opensymphony.xwork2.Action; 3 public class HelloJspAction implements Action{ 4 //与jsp中的属性name的值一样 5 private String msg; 6 private String address; 7 8 public String getMsg() { 9 return msg; 10 } 11 12 public void setMsg(String msg) { 13 this.msg = msg; 14 } 15 16 public String getAddress() { 17 return address; 18 } 19 20 public void setAddress(String address) { 21 this.address = address; 22 } 23 24 /* (non-Javadoc) 25 * @see com.opensymphony.xwork2.Action#execute() 26 */ 27 @Override 28 public String execute() throws Exception { 29 System.out.println(msg); 30 System.out.println(address); 31 return "success"; 32 } 33 }
3.struts.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <!-- /:根目录 --> 7 <package name="default" namespace="/" extends="struts-default"> 8 9 <!-- action中name的值与表单的action属性值对应 --> 10 11 <!-- 请求地址:hello class:action(servlet)地址--> 12 <action name="hello" class="com.Elastic.StrutsDemo1.ivy.action.HelloJspAction"> 13 <result name="success">/index.jsp</result> 14 </action> 15 16 <action name="login" class="com.Elastic.StrutsDemo1.ivy.action.LoginAction"> 17 <!-- result中name的与Action中的execute()返回的值一样 --> 18 <result name="success">/success.jsp</result> 19 20 <!-- 登录失败 --> 21 <result name="error">/error.jsp</result> 22 23 <!-- 验证失败。不会返回validate --> 24 <result name="input">/login.jsp</result> 25 </action> 26 27 </package> 28 </struts>
4.web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <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"> 3 <display-name>StrutsDemo1_ivy</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <!-- 配置Struts2的核心过滤器{Controller} --> 14 <!-- 将全部请求定位到指定的Struts2过滤器中 --> 15 <filter> 16 <filter-name>Struts2</filter-name> 17 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> 18 </filter> 19 <filter-mapping> 20 <filter-name>Struts2</filter-name> 21 <url-pattern>/*</url-pattern> 22 </filter-mapping> 23 </web-app>
5.index.jsp
1 <%-- 引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%-- 引入JSTL标签指令 --%> 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 <head> 9 <meta charset="utf-8"> 10 <!-- 设置浏览器渲染的引擎 --> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 <!-- 设置支持移动设备 --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <title>网页标题</title> 15 <!-- 引用bootstrap样式 --> 16 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 17 </head> 18 <body> 19 <!-- 从session中读取数据 --> 20 ${sessionScope.loginUser } 21 22 ${msg } 23 <div class="container-fluid"> 24 <form action="hello" method="post"> 25 请输入内容:<input name="msg" type="text" /> 26 请输入内容:<input name="address" type="text" /> 27 <input type="submit" value="提交"/> 28 </form> 29 </div> 30 31 <!-- 引用外部JS文件 --> 32 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 33 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 34 35 </body> 36 </html>
6.LoginAction类
1 package com.Elastic.StrutsDemo1.ivy.action; 2 3 import java.util.Map; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpSession; 7 8 import org.apache.struts2.ServletActionContext; 9 10 import com.Elastic.StrutsDemo1.ivy.entity.User; 11 import com.opensymphony.xwork2.ActionContext; 12 import com.opensymphony.xwork2.ActionSupport; 13 //ActionSupport:数据验证 override:valid() 14 public class LoginAction extends ActionSupport{ 15 /*private String userName; 16 private String userPwd; 17 18 public String getUserName() { 19 return userName; 20 } 21 22 public void setUserName(String userName) { 23 this.userName = userName; 24 } 25 26 public String getUserPwd() { 27 return userPwd; 28 } 29 30 public void setUserPwd(String userPwd) { 31 this.userPwd = userPwd; 32 }*/ 33 34 //使用hibernate框架,建实体类 35 private User user; 36 37 public User getUser() { 38 return user; 39 } 40 41 public void setUser(User user) { 42 this.user = user; 43 } 44 45 /* (non-Javadoc) 46 * @see com.opensymphony.xwork2.Action#execute() 47 */ 48 @Override 49 public String execute() throws Exception { 50 if ("admin".equals(user.getUserName().trim()) && "123456".equals(user.getUserPwd().trim())) { 51 //登录成功后,登录信息需要保存在session中 52 53 //方法1.解耦方式(Map 对象)--推荐使用 54 //从ActionContext中获取session 55 Map<String, Object> session = ActionContext.getContext().getSession(); 56 //以key/value形式保存数据 57 session.put("loginUser", user.getUserName()); 58 59 //方法2.耦合方式(原生Servlet API)--特殊功能 60 /*HttpServletRequest request = ServletActionContext.getRequest(); 61 HttpSession session = request.getSession(); 62 //setAttribute()的方式保存数据 63 session.setAttribute("loginUser", user.getUserName());*/ 64 return SUCCESS; 65 } 66 return ERROR; 67 } 68 69 @Override 70 public void validate() { 71 if (user.getUserName().trim().length() == 0) { 72 //fieldName:最好是和字段名称一致 73 this.addFieldError("userName", "用户名不能为空!");; 74 } 75 } 76 }
7.User类
1 package com.Elastic.StrutsDemo1.ivy.entity; 2 3 import java.io.Serializable; 4 public class User implements Serializable{ 5 private String userName; 6 private String userPwd; 7 public String getUserName() { 8 return userName; 9 } 10 public void setUserName(String userName) { 11 this.userName = userName; 12 } 13 public String getUserPwd() { 14 return userPwd; 15 } 16 public void setUserPwd(String userPwd) { 17 this.userPwd = userPwd; 18 } 19 }
8.success.jsp
1 <%-- 引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%-- 引入JSTL标签指令 --%> 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 <head> 9 <meta charset="utf-8"> 10 <!-- 设置浏览器渲染的引擎 --> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 <!-- 设置支持移动设备 --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <title>网页标题</title> 15 <!-- 引用bootstrap样式 --> 16 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 17 </head> 18 <body> 19 20 <div class="container-fluid"> 21 <%-- <h1>${sessionScope.loginUser }登录成功</h1> --%> 22 <div class="panel panel-primary"> 23 <div class="panel-heading">提示信息</div> 24 <div class="panel-body text-center"> 25 登录成功!<span id="time">10</span>秒后页面自动跳转到首页<br> 26 如果没有跳转,请点击<a href="index.jsp">此处</a> 27 </div> 28 </div> 29 </div> 30 31 <!-- 引用外部JS文件 --> 32 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 33 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 34 <script type="text/javascript"> 35 var time = 10; 36 function returnPage() { 37 time --; 38 if (time <= 0) { 39 window.location = 'index.jsp'; 40 } 41 $('#time').html(time); 42 } 43 44 $(function() { 45 window.setInterval(returnPage, 1000); 46 }); 47 48 </script> 49 </body> 50 </html>
9.error.jsp
1 <%-- 引入JSP页面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%-- 引入JSTL标签指令 --%> 5 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 <head> 9 <meta charset="utf-8"> 10 <!-- 设置浏览器渲染的引擎 --> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 <!-- 设置支持移动设备 --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <title>网页标题</title> 15 <!-- 引用bootstrap样式 --> 16 <link rel="stylesheet" type="text/css" href="../css/bootstrap.min.css"> 17 </head> 18 <body> 19 <div class="container-fluid"> 20 <h1>登录失败</h1> 21 </div> 22 23 <!-- 引用外部JS文件 --> 24 <script type="text/javascript" src="../js/jquery-2.2.4.js"></script> 25 <script type="text/javascript" src="../js/bootstrap.min.js"></script> 26 27 </body> 28 </html>
标签:
1.将Action的错误信息在页面输出
<%@ taglib prefix="s" uri="/struts-tags"%>
常用表单标签:
标 签 说 明
<s:form>…</s:form> 表单标签
<s:textfield>…</s:textfield > 文本输入框
<s:password>…</s:password > 密码输入框
<s:textarea>…</s:textarea > 文本域输入框
<s:radio>…</s:radio > 单选按钮
<s:checkbox>…</s:checkbox > 多选框
<s:submit /> 提交标签
<s:reset /> 重置标签
<s:hidden /> 隐藏域标签
2.使用Struts 2标签在页面中实现逻辑控制
a.使用Struts 2的通用标签
b.条件判断标签
c.迭代标签
常用通用标签:
名称 标 签 说 明
条件标签 <s:if>……</s:if> 根据表达式的值,
判断将要执行的内容 <s:elseif>……</s:elseif>
<s:else>……</s:else>
迭代 <s:iterator>……</s: iterator > 用于遍历集合
【注意:在实际开发中为了满足用户日益多变的需求。推荐使用原生的HTML以及EL表达式和JSTL标签来完成这些功能】