一。Controller基础代码(mooc)
1。UserController.java
1 /** 2 *springmvc1-2:返回jsp页面 3 * 请求URL: /user/getUserById?userId=1 4 * */ 5 @RequestMapping(value = "/getUserById",method = {RequestMethod.GET,RequestMethod.POST}) 6 public String getUserById(@RequestParam("userId") Long userId,Model model){ 7 User user=iUserService.getUserById(userId); 8 model.addAttribute(user); 9 return "user"; 10 }
2。IUserService.java
1 User getUserById(Long userId);
3。UserServiceImpl.java
1 @Override 2 public User getUserById(Long userId) { 3 return userMapper.getUserById(userId); 4 }
4。UserMapper.java
1 public User getUserById(Long userId);
5。UserMapper.xml
1 <select id="getUserById" parameterType="java.lang.Long" resultMap="userResultMap"> 2 select user_id,user_name,user_pwd,age,email from com_user 3 <where> 4 <if test="_parameter!=null"> 5 and user_id=#{userId} 6 </if> 7 </where> 8 </select>
6。user.jsp (注意pom.xml引入taglib依赖 & jsp引入taglib标签)
注意:前台取值,直接从user取值即可。
1 <%@ page contentType="text/html;charset=UTF-8"%> 2 <%@ include file="/WEB-INF/view/include/taglib.jsp" %> 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <title>jsp</title> 7 </head> 8 <body> 9 <h2>out put...</h2> 10 <h3>${user.userName}</h3> 11 </body> 12 </html>
浏览器访问http://localhost:60268/user/getUserById?userId=1即可直接返回结果。
遇到的问题:
问题原因:
mapper.xml文件原代码
1 <select id="getUserById" parameterType="java.lang.Long" resultMap="userResultMap"> 2 select user_id,user_name,user_pwd,age,email from com_user 3 <where> 4 <if test="userId!=null and userId!=''"> 5 and user_id=#{userId} 6 </if> 7 </where> 8 </select>
<if test="userId!=null and userId!=''" ...异常(test验证时出现异常)。
解决方案:
将<if test="userId!=null and userId!=''" ...替换为<if test="_parameter!=null">解决问题。
参考博客:https://www.cnblogs.com/soundcode/p/6523555.html
二。Controller现代方式-Restful风格
1。UserController.java
注意:参数应用注解@PathVariable
1 /** 2 * Restful风格的URL 3 * 请求URL: /user/getUserById2/{userId} :{userId}表示路径变量 4 * */ 5 @RequestMapping(value = "/getUserById2/{userId}",method = {RequestMethod.GET,RequestMethod.POST}) 6 public String getUserById2(@PathVariable("userId") Long userId, Map<String,Object> map){ 7 User user=iUserService.getUserById(userId); 8 map.put("user",user); 9 return "user"; 10 }
2。user.jsp (取数方式同上:user.userName)
地址栏访问:http://localhost:60268/user/getUserById2/1 (1可以为传入的动态变量)
三。Controller传统方式(HttpServletRequest)
1。UserController.java
1 /** 2 * 使用传统的HttpServletRequest之类的对象 3 * 请求url: /user/getUserById3?userId=1 4 * */ 5 @RequestMapping(value = "/getUserById3",method = {RequestMethod.GET,RequestMethod.POST}) 6 public String getUserById3(HttpServletRequest request){ 7 Long userId=Long.valueOf(request.getParameter("userId")); 8 User user=iUserService.getUserById(userId); 9 request.setAttribute("user",user); 10 return "user"; 11 }
地址栏访问:http://localhost:60268/user/getUserById3?userId=1
小结:
注解使用:
【1】@Controller:用于定义在类级别上,表示该类要被DispatcherServlet管理
【2】@RequestMapping:定义在类级别 & 方法级别上。用于组成URL完整路径
【3】@RequestParam / @PathVariable:定义在参数上。用于将参数绑定到URL
四。Binding
binding:将请求中的字段按照名字匹配的原则填入模型对象
1。UserController.java
1 /** 2 * Binding:将请求中的字段按照名字匹配的原则填入模型对象 3 * */ 4 @RequestMapping(value = "/add",method = RequestMethod.GET) 5 public String add(){ 6 return "user/user-add"; 7 } 8 9 @RequestMapping(value = "/save",method = RequestMethod.POST) 10 public String save(User user){ 11 iUserService.save(user); 12 return "redirect:getUserById2/"+user.getUserId(); 13 }
2。在WEB-INF/view包下面创建包user,在user包下创建文件user-add.jsp
index.jsp:借助index.jsp访问/user/add 跳转到user-add.jsp页面
<h3><a href="/user/add">send request(add)</a></h3>
user-add.jsp
1 <%@ page contentType="text/html;charset=UTF-8"%> 2 <%@ include file="/WEB-INF/view/include/taglib.jsp" %> 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <title>jsp</title> 7 </head> 8 <body> 9 <!--2.模拟binding --> 10 <form name="addForm" action="/user/save" method="post"> 11 <div> 12 <span>add info</span><br> 13 userId: <input type="text" id="userId" name="userId" value=""><br> 14 userName: <input type="text" id="userName" name="userName" value=""><br> 15 userPwd: <input type="text" id="userPwd" name="userPwd" value=""><br> 16 age: <input type="text" id="age" name="age" value=""><br> 17 email: <input type="text" id="email" name="email" value=""><br> 18 <input type="submit" id="submit" name="submit" value="submit"><br> 19 </div> 20 </form> 21 </body> 22 </html>
3。IUserService
int save(User user);
4。UserServiceImpl
@Override public int save(User user) { return userMapper.save(user); }
5。UserMapper.java
public int save(User user);
6。UserMapper.xml
1 <insert id="save" parameterType="com.csvalue.model.User"> 2 <!-- 3 说明:[keyProperty]:selectKey 语句结果应该被设置的目标属性(指定为哪一列生成主键) 4 [resultType]:结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。(与keyProperty类型一致) 5 [order]:这可以被设置为 BEFORE 或 AFTER。 6 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行insert语句。 7 AFTER,那么先执行insert语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。 8 注意1:该<insert>语句传入的参数为User对象(POJO),<selectKey>会将结果放入参数User中。keyProperty对应的字段在User中必须有相应的setter方法,setter参数类型也要一致。否则报错。 9 注意2:在MySQL中是支持主键自增的,那么这个时候你的order的值就必须设置为after,也就是在执行完insert操作之后才可以获取主键的值,否则的话就会报错(因为在没有执行insert操作之前没有主键的值) 10 在oracle这种不支持主键自增的数据库中 , order的值必须设置为before , 先为序列进行赋值 , 然后在执行插入操作 11 --> 12 <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="userId"> 13 select LAST_INSERT_ID() as ID 14 </selectKey> 15 insert into com_user(user_id,user_name,user_pwd,age,email) 16 values ( 17 #{userId,jdbcType=INTEGER}, 18 #{userName,jdbcType=VARCHAR}, 19 #{userPwd,jdbcType=VARCHAR}, 20 #{age,jdbcType=INTEGER}, 21 #{email,jdbcType=VARCHAR} 22 ) 23 </insert>
注意点:
【1】。UserMapper.xml使用<selectKey>,则表com_user表user_id字段必须设置为自增,类型为int,且为主键。
alter table com_user change user_id user_id int primary key auto_increment;
浏览器访问:localhost:8080 ->跳转到index.jsp页面 -》点击链接 -》 进入user-add.jsp
填写信息。submit->