JSON(JavaScript Object Notation)
    1.一种轻量级的数据交换格式
    2.通常用于在客户端和服务器之间传递数据
    3.jQuery的所有参数都是以JSON格式出现
    4.在Struts 2中通过插件的方式实现

优势(较XML):
    1.轻量级交换语言
    2.结构简单
    3.易于解析
    
JSON对象:
    语法:
        var JSON对象 = {key:value,key:value,……};
    范例:{"id":4,"name":"梅西","pwd":"6666"}
【注意:其中的key值必须是字符串】
    
JSON数组:
    语法:
        var JSON数组 = [value,value,……];
    范例:
        var countryArray = ["中国","美国","俄罗斯"];
        var personArray = [
                            {"name":"张三","age":30},
                            {"name":"李四","age":40}
                          ];
                          
步骤:
    1.导入struts2-json-plugin-xxx.jar
    2.在struts.xml中定义package并继承json-default
    3.指定<result>的type属性指定为"json"

================================Result===============================    
一、JSON类型的Result:
    1.参数说明:
        参数                    作用                                         默认值                                   适用场景
        root   指定要序列化的根对象              当前Actin中所有有返回值的getter方法的值    用于指定不需要序列化key值的数据
        includeProperties  指定根对象中要序列化的属性            当前根对象中的所有属性      用于需要序列化的属性较少的情况
        excludeProperties        指定根对象中要排除的属性              null               用于需要排除序列化的属性较少的情况
        excludeNullProperties    指定根对象中是否序列化值为空的属性    false              用于需要过滤空值的情况

2.步骤:
        a.添加第三方插件:struts2-json-plugin-xxx.jar
        b.在struts.xml中指定package继承json-default
        c.指定<result>的type属性为“json”
        d.根据业务需求合理指定param参数
    
    3.作用:
        a.返回JSON格式数据,配合jQuery实现Ajax
        b.param参数
        c.root、 includeProperties、 excludeProperties、 excludeNullProperties

范例:登录表单
1.User实体类

  1. package com.Elastic.StrutsDemo6.ivy.entity;
  2. spublic class User {
  3. private String loginName;
  4. private String loginPass;
  5.  
  6. public String getLoginName() {
  7. return loginName;
  8. }
  9. public void setLoginName(String loginName) {
  10. this.loginName = loginName;
  11. }
  12. public String getLoginPass() {
  13. return loginPass;
  14. }
  15. public void setLoginPass(String loginPass) {
  16. this.loginPass = loginPass;
  17. }
  18.  
  19. }

2.UserAction类

  1. package com.Elastic.StrutsDemo6.ivy.action;
  2.  
  3. import java.util.Date;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6.  
  7. import com.Elastic.StrutsDemo6.ivy.entity.User;
  8. import com.opensymphony.xwork2.ActionSupport;
  9.  
  10. public class UserAction extends ActionSupport {
  11. private User user;
  12.  
  13. public User getUser() {
  14. return user;
  15. }
  16.  
  17. public void setUser(User user) {
  18. this.user = user;
  19. }
  20.  
  21. private Map<String, Object> jsonResult = new HashMap<String, Object>();
  22.  
  23. public Map<String, Object> getJsonResult() {
  24. return jsonResult;
  25. }
  26.  
  27. public void setJsonResult(Map<String, Object> jsonResult) {
  28. this.jsonResult = jsonResult;
  29. }
  30.  
  31. public String login() {
  32.  
  33. //登陆成功以后,额外添加的信息
  34. /*jsonResult.put("success", true);
  35. jsonResult.put("data", user);
  36. jsonResult.put("msg", "登陆成功");
  37. jsonResult.put("loginTime", new Date());*/
  38.  
  39. if ("admin".equals(user.getLoginName().trim()) && "123456".equals(user.getLoginPass().trim())) {
  40. jsonResult.put("success", true);
  41. jsonResult.put("data", user);
  42. jsonResult.put("msg", "登陆成功");
  43. jsonResult.put("loginTime", new Date());
  44. } else {
  45. jsonResult.put("success", false);
  46. jsonResult.put("msg", "登陆失败");
  47. jsonResult.put("loginTime", new Date());
  48. }
  49. return SUCCESS;
  50. }
  51. }

3.struts.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" >
  3. <struts>
  4. <!-- 使用JSON配置 -->
  5. <package name="jsonDefault" namespace="/" extends="json-default">
  6. <action name="login" class="com.Elastic.StrutsDemo6.ivy.action.UserAction" method="login">
  7.  
  8. <!-- 配置JSON类型的result -->
  9. <!--type属性指定为"json"",将返回序列化的JSON格式数据-->
  10. <result type="json">
  11. <!-- <param name="root">user</param> -->
  12. <param name="root">jsonResult</param>
  13. </result>
  14. </action>
  15.  
  16. </package>
  17. </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>StrutsDemo6_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. <filter>
  14. <filter-name>Struts2</filter-name>
  15. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  16. </filter>
  17. <filter-mapping>
  18. <filter-name>Struts2</filter-name>
  19. <url-pattern>/*</url-pattern>
  20. </filter-mapping>
  21.  
  22. </web-app>

5.valid.js

  1. /**
  2. * rules: 对象
  3. */
  4.  
  5. var rules = {
  6. loginName : {
  7. rule : {
  8. required : true,
  9. length : [6,12]
  10. },
  11. msg : {
  12. required : '用户名不能为空',
  13. length : '用户名的长度必须在6-12位之间'
  14. }
  15. },
  16.  
  17. loginPass : {
  18. rule : {
  19. length : [6,12]
  20. },
  21. msg : {
  22. length : '密码的长度必须在6-12位之间'
  23. }
  24. }
  25. };
  26.  
  27. function validForm(form,rules) {
  28. for ( var p in rules) {
  29. form.find('#' + p).on('valid',rules[p],function(event){
  30. //使用event.data, msg内容才会不同!!!
  31. var inputRules = event.data.rule;
  32.  
  33. for ( var r in inputRules) {
  34. var value = $(this).val();
  35. if (r === 'required' && inputRules[r] === true) {
  36. if (value === '') {
  37. $(this).data('success',false);
  38.  
  39. $(this).closest('div').next().html(event.data.msg[r]);
  40.  
  41. } else {
  42. $(this).data('success',true);
  43. $(this).closest('div').next().html('');
  44. }
  45. }
  46.  
  47. //验证先后顺序
  48. /*if ($(this).data('success') === false) {
  49. return;
  50. }*/
  51.  
  52. if (r === 'length' && inputRules[r]) {
  53. if (value.length > inputRules[r][1] || value.length < inputRules[r][0]) {
  54. $(this).data('success',false);
  55.  
  56. $(this).closest('div').next().html(event.data.msg[r]);
  57.  
  58. } else {
  59. $(this).data('success',true);
  60. $(this).closest('div').next().html('');
  61. }
  62. }
  63. }
  64. });
  65. }
  66.  
  67. //事件绑定一次
  68. function valid() {
  69. //trigger:触发valid事件
  70. form.find(':input').trigger('valid');
  71. var success = true;
  72.  
  73. form.find(':input').each(function() {
  74. if ($(this).data('success') === false) {
  75. success = false;
  76. return;
  77. }
  78. });
  79. return success;
  80. }
  81.  
  82. return valid;
  83. }

6.login.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. <div class="container">
  20.  
  21. <div class="panel panel-primary">
  22. <div class="panel-heading">登陆</div>
  23. <div class="panel-body">
  24. <form class="form-horizontal" action="login" method="post" data-role="login">
  25. <div class="form-group">
  26. <label class="col-md-3 control-label" for="loginName">用户名:</label>
  27. <div class="col-md-6">
  28. <input class="form-control" id="loginName" name="user.loginName" type="text" autocomplete="off" />
  29. </div>
  30. <div class="col-md-3">
  31.  
  32. </div>
  33. </div>
  34. <div class="form-group">
  35. <label class="col-md-3 control-label" for="loginPass">密码:</label>
  36. <div class="col-md-6">
  37. <input class="form-control" id="loginPass" name="user.loginPass" type="password" />
  38. </div>
  39. <div class="col-md-3">
  40.  
  41. </div>
  42. </div>
  43. <div class="form-group">
  44. <input class="btn btn-primary btn-block" data-role="login" type="button" value="登陆" />
  45. </div>
  46. </form>
  47. </div>
  48. </div>
  49. </div>
  50.  
  51. <!-- 引入JS的样式 -->
  52. <script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-2.2.4.js"></script>
  53. <script type="text/javascript" src="<%=request.getContextPath()%>/js/bootstrap.min.js"></script>
  54.  
  55. <script type="text/javascript" src="<%=request.getContextPath()%>/js/valid.js"></script>
  56.  
  57. <script type="text/javascript">
  58. //JSON对象
  59. //测试
  60. /* var person = {
  61. "name":"李四",
  62. "age":20
  63. };
  64.  
  65. alert(person.age); */
  66.  
  67. $(function() {
  68. //方法二
  69. //给表单元素绑定一个自定义的验证事件
  70. /* $('#loginName').on('valid', function() {
  71. var name = $(this).val();
  72. if ('' == name) {
  73. $(this).closest('div').next().html('用户名不能为空!');
  74. $(this).data('success', false);
  75. } else {
  76. $(this).closest('div').next().html('');
  77. $(this).data('success', true);
  78. }
  79.  
  80. });
  81. $('#loginPass').on('valid', function() {
  82. var name = $(this).val();
  83. if ('' == name) {
  84. $(this).closest('div').next().html('密码不能为空!');
  85. $(this).data('success', false);
  86. } else {
  87. $(this).closest('div').next().html('');
  88. $(this).data('success', true);
  89. }
  90.  
  91. }); */
  92.  
  93. var valid = validForm($('form'), rules);
  94.  
  95. $('[data-role="login"]').click(function() {
  96. //获取表单
  97. var $form = $(this).closest('form');
  98.  
  99. $.ajax({
  100. url : "login",
  101. type : "post",
  102. data : $form.serialize(),
  103. //data : $(this).closest('form').serialize(),
  104. beforeSend : function() {
  105. /* var success = true;
  106.  
  107. //trigger:触发valid事件
  108. $form.find(':input').trigger('valid');
  109. $form.find(':input').each(function() {
  110. if ($(this).data('success') === false) {
  111. success = false;
  112. return;
  113. }
  114. });
  115. return success;*/
  116.  
  117. //方法三
  118. //返回方法
  119. return valid();
  120.  
  121. //方法一:
  122. /* var name = $('#loginName').val();
  123. if ('' == name) {
  124. $('#loginName').closest('div').next().html('用户名不能为空!');
  125. return false;
  126. } else {
  127. $('#loginName').closest('div').next().html('');
  128. }
  129.  
  130. var pass = $('#loginPass').val();
  131. if ('' == pass) {
  132. $('#loginPass').closest('div').next().html('密码不能为空!');
  133. return false;
  134. } else {
  135. $('#loginPass').closest('div').next().html('');
  136. } */
  137. },
  138. success : function(result) {
  139. //返回result(对象)
  140. //alert(result);
  141. alert(result.msg);
  142. if (result.success) {
  143. //window.location = 'index.jsp';
  144. }
  145. }
  146.  
  147. });
  148. });
  149. });
  150. </script>
  151. </body>
  152. </html>

二、Stream类型的Result    
    1.步骤:
        a.定义一个InputStream类型的成员变量
        b.给该变量添加getter和setter方法
        c.将要发送到客户端的数据赋值给该变量
        d.根据业务需求合理指定param参数
        
    2.作用:
        a.返回二进制数据,配合jQuery实现Ajax,或者实现验证码
    
    3.param参数
        a.contentType、inputStream

范例:验证码--在上一个范例的基础上修改
1.CodeAction类

  1. package com.Elastic.StrutsDemo6.ivy.action;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.FontMetrics;
  6. import java.awt.Graphics2D;
  7. import java.awt.image.BufferedImage;
  8. import java.io.ByteArrayInputStream;
  9. import java.io.ByteArrayOutputStream;
  10. import java.io.IOException;
  11. import java.io.InputStream;
  12. import java.util.Date;
  13.  
  14. import javax.imageio.ImageIO;
  15.  
  16. import com.opensymphony.xwork2.ActionContext;
  17. import com.opensymphony.xwork2.ActionSupport;
  18.  
  19. public class CodeAction extends ActionSupport {
  20. private InputStream inputStream;
  21.  
  22. public InputStream getInputStream() throws IOException {
  23. //1.随机生成4位的验证码
  24. String[] strs = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
  25. "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
  26. "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7",
  27. "8", "9" };
  28. String code = "";
  29. for (int i = 0; i < 4; i++) {
  30. String temp = strs[(int)(Math.random() * strs.length)];
  31.  
  32. //随机生成大写字母
  33. temp = (int)(Math.random() * 2) == 0 ? temp : temp.toUpperCase();
  34. code += temp;
  35. }
  36.  
  37. //2.生成验证码图片
  38. BufferedImage codeImg = new BufferedImage(100, 25, BufferedImage.TYPE_INT_RGB);
  39. //得到图片的绘制对象
  40. Graphics2D g2d = codeImg.createGraphics();
  41. //设置填充颜色并填充
  42. g2d.setColor(new Color(240, 240, 240));
  43. g2d.fillRect(0, 0, codeImg.getWidth(), codeImg.getHeight());
  44. //绘制验证码到图片上
  45. Font font = new Font("微软雅黑", Font.PLAIN, 20);
  46. g2d.setFont(font);
  47. //获取字体宽度
  48. FontMetrics fm = g2d.getFontMetrics();
  49. //设置左右空白和字体间隔
  50. float start = 15;
  51. float space = (float)(codeImg.getWidth() - 2 * start - fm.getStringBounds(code, g2d).getWidth()) / (code.length() - 1);
  52. //随机生成每个字符的样式
  53. for (int i = 0; i < code.length(); i++) {
  54. g2d.setColor(getRandomColor());
  55. String temp = code.charAt(i) + "";
  56. g2d.drawString(temp, start, font.getSize());
  57. start += fm.getStringBounds(temp, g2d).getWidth() + space;
  58. }
  59.  
  60. //绘制干扰项
  61. //随机生成点
  62. for (int i = 0; i < 100; i++) {
  63. g2d.setColor(getRandomColor());
  64. int x = (int)(Math.random() * codeImg.getWidth());
  65. int y = (int)(Math.random() * codeImg.getHeight());
  66. g2d.drawLine(x, y, x, y);
  67. }
  68. //随机生成线
  69. for (int i = 0; i < 10; i++) {
  70. g2d.setColor(getRandomColor());
  71. int x = (int)(Math.random() * codeImg.getWidth());
  72. int y = (int)(Math.random() * codeImg.getHeight());
  73. int x1 = (int)(Math.random() * codeImg.getWidth());
  74. int y1 = (int)(Math.random() * codeImg.getHeight());
  75. g2d.drawLine(x, y, x1, y1);
  76. }
  77.  
  78. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  79. ImageIO.write(codeImg, "png", byteArrayOutputStream);
  80. ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
  81.  
  82. //把验证码保存到session中
  83. ActionContext.getContext().getSession().put("code", code);
  84. //设置验证码有效时间
  85. ActionContext.getContext().getSession().put("codeMaxTime", new Date().getTime() + 10 * 1000);
  86.  
  87. return byteArrayInputStream;
  88. }
  89.  
  90. public Color getRandomColor() {
  91. int r = (int)(Math.random() * 256);
  92. int g = (int)(Math.random() * 256);
  93. int b = (int)(Math.random() * 256);
  94. return new Color(r, g, b);
  95. }
  96.  
  97. }

2.struts.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" >
  3. <struts>
  4.  
  5. <!-- 使用JSON配置 -->
  6. <package name="jsonDefault" namespace="/" extends="json-default">
  7. <action name="login" class="com.Elastic.StrutsDemo6.ivy.action.UserAction" method="login">
  8. <!-- 配置JSON类型的result -->
  9. <!--type属性指定为"json"",将返回序列化的JSON格式数据-->
  10. <result type="json">
  11. <!-- <param name="root">user</param> -->
  12. <param name="root">jsonResult</param>
  13.  
  14. <!-- ??? -->
  15. <param name="excludeProperties">data.loginPass</param>
  16. <param name="excludeNullProperties">true</param>
  17. </result>
  18.  
  19. </action>
  20. </package>
  21.  
  22. <package name="default" namespace="/" extends="struts-default">
  23. <action name="code" class="com.Elastic.StrutsDemo6.ivy.action.CodeAction">
  24. <result type="stream">
  25. <param name="ContentType">image/jpeg</param>
  26. <param name="inputStream"></param>
  27. </result>
  28.  
  29. </action>
  30.  
  31. </package>
  32. </struts>

3.UserAction类

  1. package com.Elastic.StrutsDemo6.ivy.action;
  2.  
  3. import java.util.Date;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6.  
  7. import com.Elastic.StrutsDemo6.ivy.entity.User;
  8. import com.opensymphony.xwork2.ActionContext;
  9. import com.opensymphony.xwork2.ActionSupport;
  10.  
  11. public class UserAction extends ActionSupport {
  12. private User user;
  13.  
  14. private String code;
  15.  
  16. public String getCode() {
  17. return code;
  18. }
  19.  
  20. public void setCode(String code) {
  21. this.code = code;
  22. }
  23.  
  24. public User getUser() {
  25. return user;
  26. }
  27.  
  28. public void setUser(User user) {
  29. this.user = user;
  30. }
  31.  
  32. private Map<String, Object> jsonResult = new HashMap<String, Object>();
  33.  
  34. public Map<String, Object> getJsonResult() {
  35. return jsonResult;
  36. }
  37.  
  38. public void setJsonResult(Map<String, Object> jsonResult) {
  39. this.jsonResult = jsonResult;
  40. }
  41.  
  42. public String login() {
  43.  
  44. long time = (long) ActionContext.getContext().getSession().get("codeMaxTime");
  45. if (time < new Date().getTime()) {
  46. jsonResult.put("msg", "验证码过期");
  47. jsonResult.put("success", false);
  48. return SUCCESS;
  49. }
  50.  
  51. String sessionCode = ActionContext.getContext().getSession().get("code").toString();
  52. if (sessionCode.equalsIgnoreCase(code)) {
  53. jsonResult.put("msg", "验证码错误");
  54. jsonResult.put("success", false);
  55. return SUCCESS;
  56. }
  57.  
  58. //登陆成功以后,额外添加的信息
  59. /*jsonResult.put("success", true);
  60. jsonResult.put("data", user);
  61. jsonResult.put("msg", "登陆成功");
  62. jsonResult.put("loginTime", new Date());*/
  63.  
  64. if ("admin".equals(user.getLoginName().trim()) && "123456".equals(user.getLoginPass().trim())) {
  65. jsonResult.put("success", true);
  66. jsonResult.put("data", user);
  67. jsonResult.put("msg", "登陆成功");
  68. jsonResult.put("loginTime", new Date());
  69. } else {
  70. jsonResult.put("success", false);
  71. jsonResult.put("msg", "登陆失败");
  72. jsonResult.put("loginTime", new Date());
  73. }
  74. return SUCCESS;
  75. }
  76.  
  77. }

4.login.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"
  17. href="<%=request.getContextPath()%>/css/bootstrap.min.css">
  18. </head>
  19. <body>
  20. <div class="container">
  21.  
  22. <div class="panel panel-primary">
  23. <div class="panel-heading">登陆</div>
  24. <div class="panel-body">
  25. <form class="form-horizontal" action="login" method="post" data-role="login">
  26. <div class="form-group">
  27. <label class="col-md-3 control-label" for="loginName">用户名:</label>
  28. <div class="col-md-6">
  29. <input class="form-control" id="loginName" name="user.loginName" type="text" autocomplete="off" />
  30. </div>
  31. <div class="col-md-3">
  32.  
  33. </div>
  34. </div>
  35. <div class="form-group">
  36. <label class="col-md-3 control-label" for="loginPass">密码:</label>
  37. <div class="col-md-6">
  38. <input class="form-control" id="loginPass" name="user.loginPass" type="password" />
  39. </div>
  40. <div class="col-md-3">
  41.  
  42. </div>
  43. </div>
  44. <div class="form-group">
  45. <label class="col-md-3 control-label" for="code">验证码:</label>
  46. <div class="col-md-6">
  47. <input class="form-control" id="code" name="code" type="password" />
  48. <img id="codeImg" alt="" src="code" onclick="getCode()"><a href="javascript:getCode();">看不清楚,换一张?</a>
  49. </div>
  50. <div class="col-md-3">
  51.  
  52. </div>
  53. </div>
  54. <div class="form-group">
  55. <input class="btn btn-primary btn-block" data-role="login" type="button" value="登陆" />
  56. </div>
  57. </form>
  58. </div>
  59. </div>
  60. </div>
  61.  
  62. <!-- 引入JS的样式 -->
  63. <script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-2.2.4.js"></script>
  64. <script type="text/javascript" src="<%=request.getContextPath()%>/js/bootstrap.min.js"></script>
  65.  
  66. <script type="text/javascript" src="<%=request.getContextPath()%>/js/valid.js"></script>
  67.  
  68. <script type="text/javascript">
  69. function getCode() {
  70. document.getElementById('codeImg').src='code?_dc='+new Data();
  71. }
  72. </script>
  73.  
  74. <script type="text/javascript">
  75. $(function() {
  76. var valid = validForm($('form'), rules);
  77.  
  78. $('[data-role="login"]').click(function() {
  79. //获取表单
  80. var $form = $(this).closest('form');
  81. $.ajax({
  82. url : "login",
  83. type : "post",
  84. data : $form.serialize(),
  85. beforeSend : function() {
  86. //返回方法
  87. return valid();
  88. },
  89. success : function(result) {
  90. alert(result.msg);
  91. if (result.success) {
  92. //window.location = 'index.jsp';
  93. }
  94. }
  95.  
  96. });
  97. });
  98. });
  99. </script>
  100. </body>
  101. </html>

Struts(六)的更多相关文章

  1. struts 2读书笔记-----struts2的开发流程

    一.将struts 2的lib文件夹下地commons-fileupload.jar.commons-io.jar.freemarker.jar.javassist.jar.ognl.jar.stru ...

  2. Struts 2 入门

    Struts 2  入门: 一:Struts 2执行流程: 1 客户端发送请求: 2这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤 ...

  3. Struts2(十五)实现文件上传

    一.导入包 需要将commons-fileupload和commons-io包和struts包一起导入 实现步骤: 在Jsp页面实现客户端选择上传文件 配置Struts.xml,拦截器会自动接收上传的 ...

  4. struts2.3.24 + spring4.1.6 + hibernate4.3.11+ mysql5.5.25开发环境搭建及相关说明

    一.目标 1.搭建传统的ssh开发环境,并成功运行(插入.查询) 2.了解c3p0连接池相关配置 3.了解验证hibernate的二级缓存,并验证 4.了解spring事物配置,并验证 5.了解spr ...

  5. Struts2学习笔记二:开发流程

    一:创建项目,添加依赖包 二:在web.xml配置核心控制器 <filter> <filter-name>struts2</filter-name> <fil ...

  6. Struts2(一)— 入门

    一.概述 1.什么是Struts2 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立 ...

  7. struts2的搭建和简单的例子(采用struts-2.5.2版本)

    struts框架的概述: 当2001年初,Struts的第一个版本在apache网站上发布,它提供了一种分离视图和业务应用逻辑的web应用方案. 在Struts诞生之前,开发人员都是在jsp里写入处理 ...

  8. struts2 结合extjs实现的一个登录实例

    一.先搭建好struts2,能够通过myeclipse高速搭建. 二.再导入extjs所需的库文件. 三.写一个实体类User package com.ext.model; public class ...

  9. [struts2学习笔记] 第三节 创建struts 2 HelloWorld所需的六个步骤

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40349201 官方文档:http://struts.apache.org/releas ...

随机推荐

  1. 小白进阶之路-python数据类型

    1.数据类型:变量值是我们存储的数据,所以数据类型值得就是变量的不同种类 2.数据分类型的原因:变量值是用来保存现实世界的中的状态的,呢么针对不同的状态就应该用不同类型上午数据去表示 (1)整型int ...

  2. 从零开始のcocos2dx生活(十)ScrollView

    目录 简介 基础变量 ScrollViewDelegate Direction _dragging _container _touchMoved _bounceable _touchLength 方法 ...

  3. 19.python中os模块的常见用法

    常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows,它是'nt', 而对于Linux/Unix用户,它是'posix'. os. ...

  4. 基于Jenkins的持续交付全流程设计与实践

    1 从理论开始 什么是DevOps? 近年来,随着DevOps理念的逐渐深入人心,企业逐渐意识到从看似重复的手工劳动中实现自动化流程处理,对于提高企业劳动生产力已经非常重要,尤其是面向互联网的开发者, ...

  5. AcWing 220. 最大公约数 | 欧拉函数

    传送门 题目描述 给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对. GCD(x,y)即求x,y的最大公约数. 输入格式 输入一个整数N 输出格式 输出一个 ...

  6. 使用SqlDependency实时监听SQL server数据库变化并执行事件

    sql server设置:ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;语句让相应的数据库启用监听服务,以便支持SqlDependency ...

  7. hdu 5139 数据的离线处理

    所谓的数据离线处理,就是将所有的输入数据全部读入后,在进行统一的操作,这样当然有好处,比如让你算好多数的阶层,但是输入的每个数是没有顺序的,其实跟可以线性的解决,但是由于没有顺序的输入,这样处理的话复 ...

  8. 函数组合的 N 种模式

    随着以函数即服务(Function as a Service)为代表的无服务器计算(Serverless)的广泛使用,很多用户遇到了涉及多个函数的场景,需要组合多个函数来共同完成一个业务目标,这正是微 ...

  9. MOS 常用链接地址

    主页面类  Exadata主页面 Exadata Database Machine and Exadata Storage Server Supported Versions (Doc ID 8888 ...

  10. 所有锁的unlock要放到try{}finally{}里,不然发生异常返回就丢了unlock了

    所有锁的unlock要放到try{}finally{}里,不然发生异常返回就丢了unlock了