springmvc02

1,创建实体类对象User

   注意要导入 bean-validator.jar 包

package com.yangw.springmvc.entity;import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.NumberFormat;
import org.springframework.format.annotation.NumberFormat.Style; /***
  * 这里的这几个注解是用来验证字段的
  */
public class User {@NotEmpty(message="用户名不能为空")private String name;@Length(min=3 ,max=10,message="密码长度应该在3-10之间")private String password;@NumberFormat(style=Style.NUMBER)@Range(min=1,max=100,message="年龄应该在1-100之间")private int age;public User() {}public User(String name, String password, int age) {this.name = name;this.password = password;this.age = age;}/**
    *get set方法这里略去
    */
}/*** Springmvc作服务器端验证更加简单* 它支持 JSR303 ,JSR是sun公司专门为java来更新的每一个标准* bean-validator.jar 是hibernate的jar包*/

2,在UserController类中完成 User的添加,显示所有内容

package com.yangw.springmvc.controller;import java.util.HashMap;
import java.util.Map;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import com.yangw.springmvc.entity.User;@Controller
@RequestMapping(value="/user")
public class UserController{private Map<String,User> users = new HashMap<String,User>();public UserController(){users.put("yangw", new User("yangw","123456",24));users.put("ganw", new User("ganw","123456",25));users.put("wangw", new User("wangw","123456",27));}//只有get请求才处理@RequestMapping(value="/users",method=RequestMethod.GET )public String list(Model model){model.addAttribute("users", users);return "user/list"; }//    //链接到add页面时是GET请求,会访问这段代码
//    @RequestMapping(value="/add",method=RequestMethod.GET )
//    public String add(Model model){
//        //这里需要提供一个User对象,因为添加的页面
//     第一种方式    model.addAttribute(new User());//        //直接返回到add页面
//        return "user/add"; 
//    }//链接到add页面时是GET请求,会访问这段代码@RequestMapping(value="/add",method=RequestMethod.GET )public String add(@ModelAttribute(value="user") User user){//第二种提供一个User对象的方式,因为添加的页面return "user/add"; }//链接到add页面时是POST请求,会访问这段代码@RequestMapping(value="/add",method=RequestMethod.POST)//这个User是一个要被验证的对象,使用@Validated说明;//紧跟@Validated来写验证结果类,用BindingResult表示public String add(@Validated User user,BindingResult br){if(br.hasErrors()){//如果有错误,到add界面显示return "user/add";}users.put(user.getName(), user);return "redirect:/user/users"; }}

3,list.jsp页面

  注意加入标签库的jar包 jsf-api.jar jsf-impl.jar jstl-1.2.jar

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body><a href="add">添加用户</a><br/><c:forEach items="${users }" var="um" ><!-- 这里的um是一个个的 键值对 -->${um.key}---${um.value.name }---${um.value.password }----${um.value.age } <br/></c:forEach>
</body>
</html>

4,add.jsp页面

  用到了springmvc的form表单

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>添加用户</title>
</head>
<body><!-- 设置为post请求,并且会自动将表单中的值添加到user中 --><!-- 此时没有写action,直接提交会提交给/add --><sf:form method="post" modelAttribute="user"><!--  sf:input path属性 中设置user对象的属性名 --><!--这个是服务器端验证 sf:errors 标签来输出 验证的错误信息 -->username:<sf:input path="name"/> <sf:errors path="name"/><br/>password:<sf:password path="password"/><sf:errors path="password"/><br/>age:<sf:input path="age"/><sf:errors path="age"/><br/><input type="submit" value="提交" /></sf:form>
</body>
</html>

5,web.xml增加编码过滤器

<filter><filter-name>characterEncoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterEncoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>

 

6,显示一个用户详细信息

    /*** @PathVariable:路径中的变量**/@RequestMapping(value="/{name}",method=RequestMethod.GET)public String show(@PathVariable String name,Model model){model.addAttribute(users.get(name));return "/user/show"; }

    show.jsp页面

<body>username:${user.name }<br/>password:${user.password}<br/>age:${user.age }</body>

    为list页面的增加超级链接

<c:forEach items="${users }" var="um" ><!-- 这里的um是一个个的 键值对 -->${um.key}---<a href="${um.value.name }">${um.value.name }</a>---${um.value.password }----${um.value.age } <br/></c:forEach>

7,用户的删除,更新

/*** 修改用户,获取原始用户页面信息**/@RequestMapping(value="/{name}/update",method=RequestMethod.GET)public String update(@PathVariable String name,Model model){model.addAttribute(users.get(name));return "/user/update"; }/*** 修改用户,对提交的数据进行更新操作**/@RequestMapping(value="/{name}/update",method=RequestMethod.POST)public String update(@Validated User user,BindingResult br){if(br.hasErrors()){//如果有错误,到add界面显示return "user/update";}users.put(user.getName(), user);return "redirect:/user/users"; }/*** 删除用户**/@RequestMapping(value="/{name}/delete",method=RequestMethod.GET)public String delete(@PathVariable String name){users.remove(name);return "redirect:/user/users"; }

    update.jsp 和 list.jsp

update.jsp页面 与add.jsp其实一样<body><!-- 设置为post请求,并且会自动将表单中的值添加到user中 --><!-- 此时没有写action,直接提交会提交给/update --><sf:form method="post" modelAttribute="user">username:<sf:input path="name"/> <sf:errors path="name"/><br/>password:<sf:password path="password"/><sf:errors path="password"/><br/>age:<sf:input path="age"/><sf:errors path="age"/><br/><input type="submit" value="提交" /></sf:form>
</body>
 <c:forEach items="${users }" var="um" ><!-- 这里的um是一个个的 键值对 -->${um.key}---<a href="${um.value.name }">${um.value.name }</a>---${um.value.password }----${um.value.age } ----<a href="${um.value.name }/update">更新</a>---<a href="${um.value.name }/delete">删除</a><br/></c:forEach>

 

转载于:https://www.cnblogs.com/yangw/p/3434627.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用基本信号画出如下的信号_股市入门基本知识丨下跌时期可以抄底的安全信号有哪些...

点击蓝色字体 关注我们 带来更多精彩股票市场中的秘籍其实就是“低买高卖”&#xff0c;不过我们不能在大盘一开始下跌的时候就进行买入&#xff0c;因为不清楚下跌的时间&#xff0c;太早介入&#xff0c;只有在反弹幅度超出我们介入的点的时候才可以进行高卖。那么什么时候才…

Flume数据传输事务分析[转]

本文基于ThriftSource,MemoryChannel,HdfsSink三个组件&#xff0c;对Flume数据传输的事务进行分析&#xff0c;如果使用的是其他组件&#xff0c;Flume事务具体的处理方式将会不同。一般情况下&#xff0c;用MemoryChannel就好了&#xff0c;我们公司用的就是这个&#xff0c;…

最近的一些校招试题摘录

最近又参加了一些校招&#xff0c;真是马不停蹄啊。多参加考试是好的&#xff0c;可以不断发现一些新的问题。下面摘录一些我不太会的题。 1.volatile的作用是什么&#xff1f; 答案&#xff1a;volatile是类型修饰符&#xff0c;用它修饰的类型变量可能会被编译器未知的因素…

yii2中的rules验证规则

2019独角兽企业重金招聘Python工程师标准>>> Rules验证规则&#xff1a;required : 必须值验证属性||CRequiredValidator 的别名, 确保了特性不为空.[[字段名],required,requiredValue>必填值,message>提示信息];email : 邮箱验证||CEmailValidator 的别名,确…

weblogic数据源配置的问题,weblogic密码破解

weblogic 报错 please increase XXX,得知是连接池出了问题&#xff0c;查看weblogic配置&#xff0c;发现没有设置超时 查看oracle 当前session&#xff0c;可以看到连接的机器&#xff0c;用户&#xff0c;当前执行的sqlid select * from v$session; select v$sql where sql_i…

自己写的简易多任务系统---基于pic18fxxx

这个工程只是实现了最简单的OS任务调度&#xff0c;对于理解任务调度有点帮助。其实就是从UC/OS-II里面摘出来的&#xff0c;没有原来的那么复杂&#xff0c;很精简&#xff0c;但道理上是一样的。工程中的CPU.C文件时直接拿Nathan Brown写好的&#xff0c;因为关于PIC任务切换…

python语言整数类型-Python 的内置数值类型

Python 是一种敏捷的、动态类型化的、极富表现力的开源编程语言&#xff0c;可以被自由地安装到多种平台上。Python 代码是被解释的。如果您对编辑、构建和执行循环较为熟悉&#xff0c;则 Python 代码对您来说更简单。但是&#xff0c;请不要搞错&#xff1a;Python 器可以是简…

滴滴出行2016校招编程题

1. 给定一个m*n的数组&#xff08;m,n>2,数组值>0&#xff09;&#xff0c;要求选出和最大的子2*2数组。例如&#xff1a; 1 2 3 4 5 6 7 8 9 显然和最大的2*2子数组是5 6;8 9.下面完成这个功能。 Input: &#xff08;m*n的数组&#xff09; 1 2 3 ; 4 5 6 ; 7 8 9 …

每天一个linux命令(22):find 命令的参数详解

find一些常用参数的一些常用实例和一些具体用法和注意事项。 1&#xff0e;使用name选项&#xff1a; 文件名选项是find命令最常用的选项&#xff0c;要么单独使用该选项&#xff0c;要么和其他选项一起使用。 可以使用某种文件名模式来匹配文件&#xff0c;记住要用引号将文件…

(WPF) DataGrid之绑定

通过ObservableCollection 绑定到 DataGrid. 1. 前台Xaml. <DataGrid x:Name"dgMeasurements"HorizontalAlignment"Left"Margin"10,69,0,10"ItemsSource"{Binding}"AutoGenerateColumns"False"Width"370">…

程序=数据结构+算法

这句名言&#xff0c;我现在品来很有感觉&#xff0c;看看uc/os-II里面那些就绪表、查找最高优先级任务等等&#xff0c;算法设计的非常巧妙&#xff0c;整个OS都是围绕着OS_TCB来运转的&#xff0c;任务需要通信&#xff0c;那就在建立个OS_EVENT&#xff0c;通过.*OSTCBEvent…

去哪笔试两题

1&#xff0c;a是一个有序数组&#xff0c;但经过向右移动数位&#xff0c;现在预在a中查找元素key的位置&#xff0c;如不存在&#xff0c;返回0。例如a[5,6.7.8,1,2,3,4]. 实现&#xff1a; 1 #quna12 def findPos(a,key):3 mina[0];4 for i in range(len(a)):5 …

MySQL5.6主从复制搭建基于日志(binlog)

什么是MySQL主从复制 简单来说&#xff0c;就是保证主SQL&#xff08;Master&#xff09;和从SQL&#xff08;Slave&#xff09;的数据是一致性的&#xff0c;向Master插入数据后&#xff0c;Slave会自动从Master把修改的数据同步过来&#xff08;有一定的延迟&#xff09;&…

opengl 如何加阴影_动漫嘴唇厚涂如何绘制?厚涂嘴唇正确画法

动漫嘴唇厚涂如何绘制&#xff1f;厚涂嘴唇正确画法&#xff01;嘴巴怎么画&#xff1f;画嘴巴真的很考验一个画师功力&#xff0c;好看的嘴巴生动而丰满&#xff0c;可以给整幅画作添上亮点&#xff0c;而画的不好的嘴巴呢&#xff0c;就容易把画面整体的风格打破。那么零基础…

位运算

我们复习一下位运算&#xff0c;这里介绍一下(& ,|, ^)的用途。 按位与 ------------& 规则&#xff1a; 0&00 0&10 1&0 0 1&11 &#xff08; 两位为1&#xff0c;才是1&#xff09;作用&#xff1a; 清零与保位。通常用来将特定的位清零&…

详解JMeter函数和变量

详解JMeter函数和变量&#xff08;1&#xff09; JMeter函数可以被认为是某种特殊的变量&#xff0c;它们可以被采样器或者其他测试元件所引用。函数调用的语法如下&#xff1a; ${__functionName(var1,var2,var3)} 其中&#xff0c;__functionName匹配被调用的函数名称。用圆括…

信号反射

突然想起来前几天调试CAN通讯的时候出现的BUG&#xff0c;那就是传说中的“信号反射”&#xff0c;也有称“振铃”的。错误刚出现的时候没有意识过来&#xff0c;还说怎么出现重复出现这么多条消息呢&#xff1f;光在书本上看到过这个概念&#xff0c;没有“实物”与之对应起来…

hdu 5199 map或二分或哈希

题目描述&#xff1a;给出n棵树的高度&#xff0c;每棵树上都站着一只鸟&#xff0c;枪手Jack站在最左边那棵树的左边对鸟进行射击&#xff0c;当Jack在高度为H的地方向右发射一颗子弹的时候&#xff0c;高度为H的树上的鸟儿就会掉落&#xff08;注&#xff1a;其他树上的鸟儿不…

数字电路实验怎么接线视频讲解_家庭影院中音箱、功放、投影机、4K播放机不知道怎么连接?手把手教你...

家庭影院中音箱、功放、投影机、4K播放机不知道怎么连接&#xff1f;手把手教你有不少用户收到从家庭影院器材之后&#xff0c;表示完全不会连接。翻看说明书也觉得头大&#xff0c;知识太多&#xff0c;然而却很难找到要点。今天主要跟大家讲讲如何连接音箱、功放、投影机和影…

.NET开发过程中的全文索引使用技巧之Solr

前言&#xff1a;相信许多人都听说过.net开发过程中基于Lucene.net实现的全文索引&#xff0c;而Solr是一个高性能&#xff0c;基于Lucene的全文搜索服务器。同时对其进行了扩展&#xff0c;提供了比Lucene更为丰富的查询语言&#xff0c;同时实现了可配置、可扩展并对查询性能…