精华内容
下载资源
问答
  • 本文实例讲述了jquery-mobile表单的创建方法。分享给大家供大家参考,具体如下: 、注意事项 1. <form> 元素必须设置 method 和 action 属性 2. 每个表单元素必须设置唯一的 “id” 属性。 该 id 在站点的...
  • 文章目录场景算法功能快捷键合理创建标题,助于目录生成如何改变文本样式插入链接与图片如何插入一段漂亮代码片生成一个适合你列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表...

    1.场景

    很多时候需要用到把一个表单拆分成几步来提交的业务场景,比如我的上个项目,某航空公司的酒店地面服务管理系统。这个系统里面在录入酒店信息的时候需要录入一大堆属性,光酒店的属性就有50多个@.@,偏偏甲方的电脑分辨率很小,这时候就需要这么个东西,把已有的50多个属性分散到7步,每次只看到其中一步,把其他隐藏。当7步填写完以后一起提交。

    2.算法

    1.点击事件触发初始化一个dialog对话框,这个对话框有上一步下一步两个按钮;
    2.当前如果是第一步,隐藏上一步按钮;
    3.如果当前是最后一步,下一步文字变为完成
    4.如果是最后一步,应触发提交事件:提交成功,关闭窗口并提示提交成功,提交失败应保持窗口并弹窗提交失败
    5.总步数的计算:在用户需要把表单内容使用

    包裹起来;表单内div.formItem的个数就是总步数了;
    6.变量及方法总览
    step:当前是第几步【全局变量】
    total:总步数【全局变量】
    $form:表单对象【全局变量】
    $dialog:对话框对象【全局变量】

    //初始化提交方法
    function submitForm(){}
    
    //初始化表单
    $.fn.initDialog = function (formId,submitFn){	
    	//formId:form表单的Id;
    	//submitFn:自定义表单提交的ajax逻辑,请提供返回值,成功返回true,失败返回false
    	//此时的$this选中的是外面的对话框
    };
    
    //上一步 点击事件
    function prev(){}
    
    //下一步 点击事件
    function next(){}
    
    //将下一个div.formItem填入对话框内,如果当前不是最后一步,则该方法需要被调用
    function loadFormItem(){}
    
    //重新渲染步骤按钮,每次点击后都需要重新渲染
    function renderStepButton(step){
    	//step:当前是第几步
    }
    

    3.完整代码

    /*
     *	@author yzh 20190626 23:11
     *  伪分步提交
     *  表单扔到dialog里,每次只显示一个formItem
     *  需要放到一起显示的内容都用一个<div class="formItem"></div>包装起来
    */
    
    let step = 0, total = 0;
    let $form   = null;
    let $dialog = null;
    //初始的提交方法
    function submitForm (){
        alert("未传入提交方法");
    }
    //初始化对话框,只显示第一个form,其它隐藏
    $.fn.initDialog = function (formId,submitFn){
        if(typeof submitFn == "function"){
            submitForm = submitFn;
        }
        //初始化成第0步
        step = 0;
        //计算总步数
        total = $form.find(".formItem").length;
    
        $form = $("#"+formId);
        if ($form === null){
            console.log("initStepDialog 第1个参数出错,找不到该表单");
            return ;
        }
        $dialog = $(this);
        //隐藏所有div.formItem
        $form.find(".formItem").hide();
      	//显示第一步
        $form.find(".formItem").eq(0).show();
        //把form装载到dialog
        $form.appendTo($dialog).show();
        //渲染按钮
        renderStepButton(step);
    };
    //上一步 点击事件
    function prev(){
        if(step === 0){
            return ;
        }
        if (step > 0) {
            $form.find(".formItem").eq(step).hide();
            step--;
            $form.find(".formItem").eq(step).show();
        }
        if(step < 0 ){
            step = 0;
        }
        loadFormItem();
    }
    
    //下一步 点击事件
    function next(){
        if (step === total) {
            return ;
        }
        $form.find(".formItem").eq(step).hide();
        step++;
        $form.find(".formItem").eq(step).show();
        loadFormItem();
    }
    //将下一个表单填入对话框内,如果已经完成最后一步,则关闭对话框
    function loadFormItem(){
        if(step <= total-1 ){
            renderStepButton(step);
        }else{
            new Promise((resolve)=>{
                resolve(submitForm());
            }).then((value)=>{
                if (value == undefined){
                    alert("我们需要你的提交方法里有返回值,成功请返回true,失败请返回false!");
                }else if (value){
                    $dialog.dialog('close');
                }else{
                    $form.find(".formItem").each(function(i,item){
                        $(item).hide();
                    });
                    step -- ;
                    $form.find(".formItem").eq(step).show();
                }
            })
        }
    }
    
    
    //重新渲染步骤按钮
    function renderStepButton(step){
        if(step === 0){
            $("#prev").hide();
            $("#next").show().text("下一步");
            $.parser.parse( $("#prev"));
            $.parser.parse( $("#next"));
            
            return ;
        }
        if(step === total-1) {
            $("#prev").show();
            $("#next").show().text("完成");
            $.parser.parse( $("#prev"));
            $.parser.parse( $("#next"));
            return;
        }
    
        $("#prev").show().text("上一步");
        $("#next").show().text("下一步");
        $.parser.parse( $("#prev"));
        $.parser.parse( $("#next"));
    }
    

    4.html

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Complex Toolbar on Dialog - jQuery EasyUI Demo</title>
        <link rel="stylesheet" type="text/css" href="themes/default/easyui.css">
        <link rel="stylesheet" type="text/css" href="themes/icon.css">
        <script type="text/javascript" src="jquery.min.js"></script>
        <script type="text/javascript" src="jquery.easyui.min.js"></script>
    </head>
    <body>
    
    <div style="width: 100%;height: 100%;" >
        <div id="aaa" class="easyui-dialog" style="width:600px;height:300px"
             data-options="title:'表单分步骤提交',modal:true,closed:true,
    			buttons:[{
    				text:'上一步',
    				id:'prev',
    				handler:function(){
    				    prev();
    				}
    			},{
    				text:'下一步',
    				id:'next',
    				handler:function(){
    				    next();
    				}
    			}]">
            <div data-options="fit:true" id="content"></div>
        </div>
    </div>
    
    <div style="display: none;" id="hiddenForm">
        <!--把每一步需要显示的内容用<div class="formItem"></div>包起来 -->
        <div class="formItem">
            姓名:<input name="name">
        </div>
        <div class="formItem">
            密码:<input name="password">
        </div>
        <div class="formItem">
            手机号:<input name="cellphone">
        </div>
        <div class="formItem">
            邮箱:<input name="email">
        </div>
    </div>
    <script type="text/javascript" src="step2.js?"></script>
    <a href="javascript:void(0)" id="open" class="easyui-linkbutton">Open</a>
    <a href="javascript:void(0)" id="close" class="easyui-linkbutton" >Close</a>
    <script type="text/javascript">
        function mySubmit(){        
            /*
             * 这里ajax提交需要一个返回值,提交成功:true 提交失败:false
             *
             */
            $.ajax({
                url:"aaaa",//示例中的url会提交失败并返回false,此时窗口不会关闭;请改成你自己的url
                data:{"a":1},
                type:'POST',
                success:function(){
                    console.log("true");
                    return true;
                },
                error:function(){
                    console.log("false");
                    return false;
                }
            });
        }
        //打开对话框的点击事件
    	$("#open").click(function(){
            $("#aaa").initDialog("hiddenForm",mySubmit);
    		$('#aaa').dialog('open');
        });
        //关闭对话框的点击事件
    	$("#close").click(function(){
    		$('#aaa').dialog('close');
    	});
    	//开始初始化对话框
    	$("#aaa").initDialog("hiddenForm",mySubmit);
    </script>
    </body>
    </html>
    

    5.github链接地址

    展开全文
  • 一个按钮提交时依赖多个需校验的表单,如下图执行按钮依赖两个必输项的表单 执行函数里代码如下: 1、创建Promise接收校验通过返回resolve 2、Promise.all()以数组形式传入创建好需要依赖Promise,当所有...

    一个按钮提交时依赖多个需校验的表单,如下图的执行按钮依赖两个有必输项的表单
    在这里插入图片描述执行函数里代码如下:
    在这里插入图片描述
    1、创建Promise接收校验通过返回的resolve
    2、Promise.all()以数组的形式传入创建好需要依赖的Promise,当所有依赖的Promise返回resolve后执行then方法

    注:其他需要依赖多个异步返回结果的操作此方法同样适用,此代码并不严谨只供参考,欢迎留言指教!

    展开全文
  • 我前台有一个发贴的表单,但我想后台给相关表单对象加一下字段:用sesion['username']填充,session不可见 即前台不显示用户名,不构建在表单中,当表单提交时,我想将判断一下session,并sesion['username']同时写...
  • 今天我们将使用AngularJs和伟大UI Router以及Angular ngAnimate module创建一个带动画多步表单。这项技术可以用在你想要简化用户操作表单上。 我们看到这项技术已经应用在了许多网页上。比如购物车,注册...
  • 文章转发自专业Laravel开发者社区,原始链接:https://learnku.com/laravel/t/34450我们在第三部分中放弃构建真实用户端...在处理第一个表单时,我们机会了解如何定义动态 Vue 路由。我们路由动态部分是与...

    fe58850d5ffa164fc784139af527f5ba.png
    文章转发自专业的Laravel开发者社区,原始链接:https://learnku.com/laravel/t/34450

    我们在第三部分中放弃构建真实的用户端,而学习使用 Vue 路由获取组件数据的新方式。现在我们准备将注意力转移到为用户创建 CRUD(增删改查)的功能上 —— 本教程将聚焦在编辑已存在的用户。

    在处理第一个表单时,我们有机会了解如何定义动态 Vue 路由。我们的路由的动态部分是与用户数据记录匹配的用户 ID。对于编辑用户,Vue 路由如下所示:

    /users/:id/edit

    这个路由的动态部分是 :id 参数,它将取决于用户的 ID。我们将使用数据库中的 id 字段,但你也可以使用 UUID 或者其他的数据标识。

    安装

    在处理 Vue 组件之前,我们需要定一个新的 API 接口来获取指定的用户,然后再定义一个接口来处理更新。

    打开 routes/api.php 路由文件,在获取全部用户的 index 路由下方添加下面的路由:

    Route::namespace('Api')->group(function () {
        Route::get('/users', 'UsersController@index');
        Route::get('/users/{user}', 'UsersController@show');
    });

    理由 Laravel 内置的路由模型绑定,控制器方法将很简单明了。在 app/Http/Controllers/Api/UsersController.php 中添加下面的方法:

    // app/Http/Controllers/Api/UsersController
    
    public function show(User $user)
    {
        return new UserResource($user);
    }

    /api/users/1 这样请求一个用户,将返回如下的 JSON

    {
        "data": {
            "name": "Antonetta Zemlak",
            "email":"znikolaus@example.org"
        }
    }

    第三部分的 UserResource 需要包含 id 列,所以需要更新 app/Http/Resources/UserResource.php 添加 id 键。整个文件如下:

    <?php
    
    namespace AppHttpResources;
    
    use IlluminateHttpResourcesJsonResource;
    
    class UserResource extends Resource
    {
        /**
         * Transform the resource into an array.
         *
         * @param  IlluminateHttpRequest  $request
         * @return array
         */
        public function toArray($request)
        {
            return [
                'id' => $this->id,
                'name' => $this->name,
                'email' => $this->email,
            ];
        }
    }

    现在 /api/users/api/users/{user} 路由都将返回 id 字段,通过这个,可以在路由中区分用户。

    定义 UsersEdit 组件

    定义了 show 之后,我们接着定义 Vue 中的路由和相应的组件。新增相应的路由到 resources/js/app.js 中。下面是引入 UsersEdit 组件(尚未创建)和整个路由实例的代码片段:

    import UsersEdit from './views/UsersEdit';
    
    // ...
    
    const router = new VueRouter({
        mode: 'history',
        routes: [
            {
                path: '/',
                name: 'home',
                component: Home
            },
            {
                path: '/hello',
                name: 'hello',
                component: Hello,
            },
            {
                path: '/users',
                name: 'users.index',
                component: UsersIndex,
            },
            {
                path: '/users/:id/edit',
                name: 'users.edit',
                component: UsersEdit,
            },
        ],
    });

    我们在 routes 末尾新增了 users.edit 路由。

    下一步, 我们需要在 resources/assets/js/views/UsersEdit.vue 中创建 UsersEdit 组件。代码如下:

    <template>
      <div>
          <form @submit.prevent="onSubmit($event)">
            <div class="form-group">
                <label for="user_name">Name</label>
                <input id="user_name" v-model="user.name" />
            </div>
            <div class="form-group">
                <label for="user_email">Email</label>
                <input id="user_email" type="email" v-model="user.email" />
            </div>
            <div class="form-group">
                <button type="submit">Update</button>
            </div>
        </form>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          user: {
            id: null,
            name: "",
            email: ""
          }
        };
      },
      methods: {
        onSubmit(event) {
            // @todo form submit event
        }
      },
      created() {
          // @todo load user details
      }
    };
    </script>

    首先看下 template 部分:我们在 div 中书写 <form> ,因为稍后我们只需要在加载了 user 数据后展示 <form>

    <form> 有一个默认的 @submit 事件,我们定义了一个 onSubmit() 方法去处理它。最后需要提一下在 <input> 元素上的 v-model 属性,它和 data.users 对象一一对应。我们为 idname,和 email 设置了默认值。

    现在你打开 /users/1/edit 应该看到一个空白的表单:

    b58c5adb0b1daf7c9f4fa783dff48e6f.png

    我们准备编辑已经存在的用户,所以下一步会说明怎么获取路由中动态的 :id ,在 UsersEdit.vue 中加载用户数据。

    使用专用的模块获取用户详情

    在我们在组件中加载用户数据之前,我们先定义一个额外的专用模块去处理 /api/users 的资源,包括查询所有用户,查询单个用户和更新用户。

    第一步,创建一个新的文件夹来放置请求后端的模块。你可以用任意方式来创建这些文件。下面我们展示了在 Nix 下的命令:

    mkdir -p resources/assets/js/api/
    touch resources/assets/js/api/users.js

    users.js 模块会暴露一些用来处理 /api/users 资源的方法。这个模块会尽可能的简单,但之后你可以在请求之前或者之后随意处理数据。这个文件用作可复用的API操作的存储库:

    import axios from 'axios';
    
    export default {
        all() {
            return axios.get('/api/users');
        },
        find(id) {
            return axios.get(`/api/users/${id}`);
        },
        update(id, data) {
            return axios.put(`/api/users/${id}`, data);
        },
    };

    现在我们可以使用同样的模块去获取所有用户,查询和更新单个用户:

    // 获取所有用户
    client.all().then((data) => mapData);
    
    // 查询单个用户
    client.find(userId);

    目前为止,all() 方法不支持分页,需要你自己去实现分页,然后使用新的 all() 替换 UsersIndex.vue 组件中的方法。

    在 UsersEdit 组件中加载用户数据

    现在我们有了一个可复用但很简陋的api客户端,当编辑页面生成之后我们使用它来获取用户数据。

    最初,我们在组件中添加了 created() 方法,现在我们可以在它里面获取用户的数据:

    // UsersEdit.vue Component
    <script>
    import api from '../api/users';
    
    export default {
      // ...
      created() {
          api.find(this.$route.params.id).then((response) => {
            this.loaded = true;
            this.user = response.data.data;
          });
      }
    }
    </script>

    created() 中,users.js 客户端使用 find() 方法返回了一个 Promise 对象。在 Promise 的回调中,我们设置了 loaded 属性(尚未创建)并设置了the user 属性。

    现在往 data 中添加 loaded 属性,默认值为 false :

    data() {
      return {
        loaded: false,
        user: {
          id: null,
          name: "",
          email: ""
        }
      };
    },

    由于我们的组件在 created() 中加载数据,所以在组件加载数据时显示「加载」的提示消息:

    <div v-if="! loaded">Loading...</div>
    <form @submit.prevent="onSubmit($event)" v-else>
    <!-- ... -->
    </form>

    刷新页面,你会看到一个简单的 Loading... 信息:

    832202ab363a853550c2d12b146722f4.png

    然后用户数据会显示在表单中:

    7adf93a57925e31c931dd963fd09a274.png

    API速度很快,如果你要确定 loading 提示正常工作,你需要使用 setTimeout 去延迟设置 user 属性:

    api.find(this.$route.params.id).then((response) => {
        setTimeout(() => {
          this.loaded = true;
          this.user = response.data.data;
        }, 5000);
    });

    上面的代码会显示 loading 消息5秒,然后设置 loadeduser 属性。

    更新用户

    我们将完成 onSubmit() 方法,并用过 PUT /api/users/{user} 更新用户。

    我们先完善 onSubmit() ,之后会转到后端处理数据库的更新:

    onSubmit(event) {
      this.saving = true;
    
      api.update(this.user.id, {
          name: this.user.name,
          email: this.user.email,
      }).then((response) => {
          this.message = 'User updated';
          setTimeout(() => this.message = null, 2000);
          this.user = response.data.data;
      }).catch(error => {
          console.log(error)
      }).then(_ => this.saving = false);
    },

    我们通过用户 ID 调用 api.update() 方法,传入从绑定表单中获取的 nameemail 的值。

    然后我们在 Promise 上链接一个回调方法,在 API 成功执行之后设置成功提示信息,并设置最新的用户数据。2000 毫秒后我们置空提示信息,这同样会隐藏模板中的消息。

    目前为止,我们只是单纯的抓取所有错误并输出到控制台。未来,我们会回头重写错误(服务端错误或者验证错误)处理,但是现在,我们略过这一部分,专注在请求成功后的处理。

    我们通过 this.saving 来确定我们是否在更新用户信息。我们给模板添加了 :disabled 属性,来避免重复提交,它能保证当我们在更新数据时提交按钮是禁止状态:

    <div class="form-group">
      <button type="submit" :disabled="saving">Update</button>
    </div>

    我们在 catch 之后另外链接了一个 then(),一旦 API 请求结束,就将 this.saving 设为 false 。我们需要重置这个属性为 false ,来确保我们可以再次提交数据。我们最后的 then() 使用了 _ 来表示这里有一个变量,但我们并不需要使用。你也可以定义一个使用空括号的箭头函数:

    .then(() => this.saving = false);

    我们在 data() 中新添了了两个属性:

    data() {
      return {
        message: null,
        loaded: false,
        saving: false,
        user: {
          id: null,
          name: "",
          email: ""
        }
      };
    },

    下一步,我们来修改 <template> 来展示 message

    <template>
      <div>
          <div v-if="message" class="alert">{{ message }}</div>
          <div v-if="! loaded">Loading...</div>
          <form @submit.prevent="onSubmit($event)" v-else>
            <div class="form-group">
                <label for="user_name">Name</label>
                <input id="user_name" v-model="user.name" />
            </div>
            <div class="form-group">
                <label for="user_email">Email</label>
                <input id="user_email" type="email" v-model="user.email" />
            </div>
            <div class="form-group">
                <button type="submit" :disabled="saving">Update</button>
            </div>
        </form>
      </div>
    </template>

    最后,我们在 UsersEdit.vue 文件底部为 alert 信息添加一些样式:

    <style lang="scss" scoped>
    $red: lighten(red, 30%);
    $darkRed: darken($red, 50%);
    .form-group label {
      display: block;
    }
    .alert {
        background: $red;
        color: $darkRed;
        padding: 1rem;
        margin-bottom: 1rem;
        width: 50%;
        border: 1px solid $darkRed;
        border-radius: 5px;
    }
    </style>

    现在,前端组件已经修改完毕,它可以处理表单的提交,并能在 API 成功执行之后同步更新模板。现在我们需要转到后端来完成剩下的部分。

    在 API 后端更新用户

    我们准备在 User 资源控制器上定义一个 update 方法来连接所有部分。我们在服务端进行数据验证。但我们暂时不会和前端对接。

    第一步,我们在 routes/api.php 中定义新的路由 PUT /api/users/{user}

    Route::namespace('Api')->group(function () {
        Route::get('/users', 'UsersController@index');
        Route::get('/users/{user}', 'UsersController@show');
        Route::put('/users/{user}', 'UsersController@update');
    });

    下一步,UsersController@update 方法会使用 request 对象来验证数据,并返回我们要更新的数据。把下面的方法添加到 app/Http/Controllers/Api/UsersController.php 中:

    public function update(User $user, Request $request)
    {
        $data = $request->validate([
            'name' => 'required',
            'email' => 'required|email',
        ]);
    
        $user->update($data);
    
        return new UserResource($user);
    }

    show() 方法那样,我们使用隐式的模型绑定从数据库中加载用户数据。数据验证后,更新用户模型,并新建一个 UserResource ,返回更新过的模型。

    成功的面向后端的请求会返回更新过的用户的数据(JSON格式),然后我们用它更新 Vue 组件中的 this.user 属性。

    {
      "data": {
        "id": 1,
        "name":"Miguel Boyle",
        "email":"hirthe.joel@example.org"
      }
    }

    导航到编辑页面

    我们一直在直接请求 /users/:id/edit 页面, 但是,我们没有在界面的任何地方添加路由。 在看到我是如何做到这一点之前,不妨自己尝试找出如何动态地导航到编辑页面。

    这是我在 第二部分 创建了 UsersIndex.vue 模板,并为 /users 索引页上列出了每个用户添加编辑链接的方式:

    <ul v-if="users">
        <li v-for="{ id, name, email } in users">
            <strong>Name:</strong> {{ name }},
            <strong>Email:</strong> {{ email }} |
            <router-link :to="{ name: 'users.edit', params: { id } }">Edit</router-link>
        </li>
    </ul>

    我们重新构造循环中的 user 对象,以提供 id, nameemail 属性。我们使用 <router-link/> 组件来引入我们的命名的 users.edit 路由,使用 params 传递 id 参数。

    为了更好地可视化 <router-link> 属性,面是我们之前添加的 app.js 文件中的路由定义:

    {
      path: '/users/:id/edit',
      name: 'users.edit',
      component: UsersEdit,
    },

    如果您刷新应用程序或访问 /users 端点,您将看到如下内容:

    806f06b09ff13c761c3ddb45343fa48b.png

    将他们放在一起

    如果你现在想编辑一个用户,在后台需要保存它并返回一个200的状态码来表示响应成功。 在 PUT 成功请求之后你应该会在两秒钟内看到以下内容:

    cd2b93e7a89c143165d8d794728aa73d.png

    你可以在下面看到完整的UsersEdit.vue组件内容:

    <template>
      <div>
          <div v-if="message" class="alert">{{ message }}</div>
          <div v-if="! loaded">Loading...</div>
          <form @submit.prevent="onSubmit($event)" v-else>
            <div class="form-group">
                <label for="user_name">Name</label>
                <input id="user_name" v-model="user.name" />
            </div>
            <div class="form-group">
                <label for="user_email">Email</label>
                <input id="user_email" type="email" v-model="user.email" />
            </div>
            <div class="form-group">
                <button type="submit" :disabled="saving">Update</button>
            </div>
        </form>
      </div>
    </template>
    <script>
    import api from '../api/users';
    
    export default {
      data() {
        return {
          message: null,
          loaded: false,
          saving: false,
          user: {
            id: null,
            name: "",
            email: ""
          }
        };
      },
      methods: {
        onSubmit(event) {
            this.saving = true;
    
            api.update(this.user.id, {
                name: this.user.name,
                email: this.user.email,
            }).then((response) => {
                this.message = 'User updated';
                setTimeout(() => this.message = null, 10000);
                this.user = response.data.data;
            }).catch(error => {
                console.log(error)
            }).then(_ => this.saving = false);
        }
      },
      created() {
          api.find(this.$route.params.id).then((response) => {
              setTimeout(() => {
                this.loaded = true;
                this.user = response.data.data;
              }, 5000);
          });
      }
    };
    </script>
    <style lang="scss" scoped>
    $red: lighten(red, 30%);
    $darkRed: darken($red, 50%);
    .form-group label {
      display: block;
    }
    .alert {
        background: $red;
        color: $darkRed;
        padding: 1rem;
        margin-bottom: 1rem;
        width: 50%;
        border: 1px solid $darkRed;
        border-radius: 5px;
    }
    </style>

    作业

    用户信息更新成功后,我们仅仅只是在两秒钟后重置该消息。 修改为已设置消息,并将用户重定向回先前的位置(如, /users 页)。

    其次,在表单底部添加一个 返回取消 按钮,以放弃更新,并导航回上一页。

    如果您认为不严谨,请在 UsersEdit 组件向 API 发送无效请求时显示验证错误。 成功提交表单后,清除错误消息。

    下一步是什么

    随着用户的更新,我们将注意力转移到删除用户上。删除用户将有助于演示成功删除后以编程方式进行导航。现在,我们将定义一个全局404页面,因为我们具有用于编辑用户的动态路由。

    如果您准备好了,请继续第五部分.

    展开全文
  • 细心小伙伴们就发现了每一个表单属性(也就是input标签,要注入到哪个bean中)就会重新创建一个对象, 导致最后一个bean里面只有最后一个表单属性传过来值, 这个问题我一直以为是框架问题, 后面发现是方法没...

    可能有的小伙伴们就遇到了这种问题, 表单提交到action对象中, 进行注入时, 发现只有一个属性有值, 有细心的小伙伴们就发现了每一个表单属性(也就是input标签,要注入到哪个bean中)就会重新创建一个对象, 导致最后一个bean里面只有最后一个表单属性传过来的值, 这个问题我一直以为是框架问题, 后面发现是有个方法没写 导致出现这种问题.代码如下: 

    jsp中有一个表单: 提交到action的login方法中;

    <form action="user!login">
        <table width="100%">
    	    <tr>
    	        <th>
    			    用户名
    		    </th>
    		    <td>
    			    <input size="10" maxlength="20" name="user.usrName" />
    		    </td>
    		</tr>
    		<tr>
    			<th>
    				密码
    			</th>
    			<td>
    		    	<input type="password" size="10" maxlength="20" name="user.usrPassword" />
    			</td>
    		</tr>
    		<tr>
    		    <td>
    		    	&nbsp;
    			</td>
    			<td>
                    <input type="submit"/>
    			</td>
    		</tr>
        </table>
    </form>

    action中login方法如下:

    private SysUser user;
    	
    public String login(){
    	System.out.println(user);
    }
    
    public void setUser(SysUser user) {
    	this.user = user;
    }

    有发现什么吗? 有的小伙伴跟这个action是不是如出一辙呢, 请继续往下看

    action.xml配置: 

    	<package name="p1" namespace="/" extends="struts-default">
            //这个ua引用的是spring主配置文件(applicationContext.xml)中的bean对象,指向action类
    		<action name="user" class="ua">
    			<result>/index.jsp</result>
    		</action>
    	</package>

    然后在jsp页面登录运行, 就出现了bean对象只有一个值,其余属性值都为null, 这是什么原因呢? 其实只需要加个方法就能完美解决.

    只需要在action中加个get方法就可以完美解决

    ​
    private SysUser user;
    	
    public String login(){
    	System.out.println(user);
    }
    
    public void setUser(SysUser user) {
    	this.user = user;
    }
    
    public SysUser getUser() {
    	return user;
    }
    
    ​

    登录运行 打印出:

    SysUser [usrFlag=null, usrId=null, usrName=fdsa, usrPassword=vcxz, usrRoleId=null]

    因为只提交了用户名跟密码所有只有这两个有值

     

     

    展开全文
  • 创建一个MDE文件

    2020-05-18 00:40:52
    这些是有关如何创建mde文件基本说明 。 创建“ filename.mdb”前端备份副本 转到“工具-启动”,然后将... 请注意,如果您任何用户是经验用户,他们可能会找到解决方法。 这将需要经验丰富开发人...
  • 关于提交表单的方法

    2018-01-15 10:15:21
    而button按钮是创建一个按钮,对于实现按钮将会发生什么事这个不一定,考页面编辑人员决定,例如在同一天网页表单上,用户输入时可能输入错误或是偏差,则可以在网页上创建一个button-清除(重置)按钮,一张
  • 本文内容: 正则表达式 正则表达式使用方法 正则表达式特殊匹配字符 正则表达式修饰符 利用正则表达式进行表单验证例子 首发日期:2018-05-13 正则表达式: 正则表达式使用方法: 首先创建正则表达式对象: ...
  • —把标签和控件放在一个 class .form-group <div> 中。这是获取最佳间距所必需。 —向所有文本元素 <input>、<textarea> 和 <select> 添加 class .form-control。 <form role=...
  • 我们需要找到方法,允许我们客户在我们应用程序内单个视图中编辑多产品,其中每产品都有一套独特验证规则。 事实证明这具有挑战性,因为它要求我们在HTML源代码中具有多<form>标记...
  •  •·把标签和控件放在一个 class .form-group <div> 中。这是获取最佳间距所必需。  •·向所有文本元素 <input>、<textarea> 和 <select> 添加 class .form-control <form ...
  • HTML 表单用于收集用户输入,与服务器进行交互,使用form元素来定义一个HTML表单。下面简单介绍表单中常见元素的用法。 1.表单标签 form 属性: action : 数据提交的服务器地址 method: 数据提交的方法 数据提交...
  • html创建表单元素

    千次阅读 2006-07-03 03:17:00
    创建表单使用元素,以及在期间插入相关元素(组件),可以创建作为html文档一部分的表单语法 注意get方法提交表单是,提交数据被附加导url上,作为url一部分发送到服务器端Post 方法是将表单信息作为一个数据块...
  • Netlify 带内置表单处理功能,可以用来存储表单数据,下载 csv 文件,同时可以在接收到新提交时发送邮件通知或者通过配置 ...创建一个 form 表单 <!-- data-netlify="true" 表明使用 form 功能 netlify-ho
  • form表单提交到servlet两种方法

    万次阅读 多人点赞 2018-03-19 12:38:02
    创建一个名为LoginServlet的Servlet,下面是doGet与doPost部分3. 配置web.xml,这是最关键的一步 需要注意的是url-pattern这里写的是/login,而在jsp中form表单的action写的是login,而不是/login。第二种方法:1. ...
  • 一般情况下我们给某个下拉框绑定数据的时候,为了方便快速以及减少代码量,我们会专门给它封装一个函数,以便写代码的时候直接调用,在这里就两种创建下拉框的方法: 1、JQuery根据url创建下拉框的方法的封装: ...
  • •·把标签和控件放在一个 class .form-group 中。这是获取最佳间距所必需。•·向所有文本元素 、 和 添加 class .form-control名称placeholder="请输入名称">文件输入这里是块级帮助文本实例。 请...
  • 因此,这里会有一个表单更新值问题。 而通常我们会透过 FormGroup 下三种方式 setValue、patchValue、reset 将值写入表单当中。 当然,或许我说这三种方式时你压根就没有做过,那说明在表单上你依赖是双向...
  • ,我今天看见有一个方法可以解决这个问题 如一个正常index.asp页面,并且用ASP代码调出数据库中内容,另建一个makehtml.asp页面,加入一个textarea域,假设为name=body,将index.asp在textarea里调出来,如: ...
  • 一个有用快速地创建新浪微博表情选择替代jQuery插件。 何特点 使用简单,一行代码即可创出出表情选择 自带智能表情解析方法(但还是建议表情解析在服务端进行) 兼容IE6 +,Chrome,Firefox,Opera等各种...
  • 前言众所周知Angular响应式表单相比较模板驱动表单更大操作性、更易测试...因此,这里会有一个表单更新值问题。而通常我们会透过 FormGroup 下三种方式 setValue、patchValue、reset 将值写入表单当中。当然,或...
  • 场景描述:对于一个登录页面中有一个登录的表单,但是由于登录验证逻辑比较复杂,我们希望点击登录后不刷新当前页面,给出登录结果后再选择是跳到新页面还是提示用户名密码错误。类似这样问题很多很多。异步获取...
  • 执行禁止用户提交数据复杂业务约束带来给开发商一个显著许多独特挑战。 最近,我和我团队,而写在GiftCards.com应用都面临着这样挑战。 我们需要找到一种方法,让我们客户能够编辑多个产品在我们应用...
  • 在上一篇"ASP.NET MVC异步验证是如何工作01,jQuery验证方式、错误信息提示、validate方法的背后"中,了解了jQuery如何验证,如何显示错误信息,本篇... 这样的一个模型: public class Student { public i...
  • 1. 建立AddAskForm表单,建立表单的方法有两种: a. 按照注释中的一般方法进行定义 b.使用modelForm进行定义:适用于已经存在相应的model,且大部分表单中的字段和model中相同的情况 import re from django ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 753
精华内容 301
关键字:

创建一个表单的方法有