实训第五天之ssh框架后台代码实现

时间:2022-11-26 20:44:58

实训第五天,学习了ssh框架下的对信息的增删改查和用户的登录。
1、在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。
Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法 是否使用了@RequestMapping 注解。@Controller只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器

2、Controller中 使用@RequestMapping 可以设置访问的路径和方式等属性,通过查看相关文档,RequestMapping*有六个属性:value, method,consumes,produces,params,headers:

1)value:   指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
2)method:  指定请求的method类型, GET、POST、PUT、DELETE等;;
3)consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
4)produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
5)params:  指定request中必须包含某些参数值是,才让该方法处理。
6)headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

例如:@RequestMapping(value = “queryUser”, method = { RequestMethod.GET })

一个Controller类的源码:

package com.iss.controller;

import java.util.List;

import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.iss.entity.User;
import com.iss.service.UserService;
//指定了一个控制器类
@Controller
//指定类的访问路径为/user
@RequestMapping("/user")
public class UserController {
    /** Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。*/
    @Autowired
    private UserService userService;

    //定义queryUser()方法的相对访问路径为queryUser 当在请求的queryUser的时候需要通过/user/queryUser进行访问。/user为类的路径
    @RequestMapping(value = "queryUser", method = { RequestMethod.GET })
    public ModelAndView queryUser() throws Exception {
        List<User> userList = userService.findAll();
        /** ModelAndView类别就如其名称所示,是代表了MVC Web程序中Model与View的对象, mv.addObject("userList", userList);可以像request一样将数据一起传入跳转的页面中 mv.setViewName("user/list");添加一个响应jsp界面,在return ModelAndView的对象的时候显示 */
        ModelAndView mv = new ModelAndView();
        mv.addObject("userList", userList);
        mv.setViewName("user/list");
        return mv;
    }

    // 编辑
    @RequestMapping(value = "editUser", method = { RequestMethod.POST })
    public String edit(User user) throws Exception {

        userService.modify(user);
        //重定向,将页面重定向到queryUser.action请求
        return "redirect:/user/queryUser.action";

    }

    // 编辑ui
    @RequestMapping("edit")
    public ModelAndView editUi(Integer id) throws Exception {
        User user = userService.findById(id);
        ModelAndView mv = new ModelAndView();
        mv.addObject("user", user);
        mv.setViewName("user/edit2");
        return mv;
    }

    @RequestMapping(value = "login",method= {RequestMethod.POST})
    public String login(@RequestParam("account")String account,@RequestParam("pwd")String pwd,HttpSession session,Model model) throws Exception{
    //HttpSession session为了将用户登陆的信息储存在session中,使用session.setAttribute()方法
    //Model 使用Model完成对账号密码错误的回显功能,Model对象的使用方法和session对象很相似
        List<User> users = userService.findByAccountAndPwd(account, pwd);
        if(users != null && users.size() ==1) {
            session.setAttribute("session_user", users.get(0));
            return "redirect:/user/queryUser.action";
        }else {

            model.addAttribute("error", "用户名或者密码错误");
            model.addAttribute("account", account);
            return "user/login";
        }


    }

}

3、mybatis Mapper的配置:

  • UserMapper接口的定义:

    @Mapper注解的componentModel属性:

    componentModel属性用于指定自动生成的接口实现类的组件类型。这个属性支持四个值:
    
    default: 这是默认的情况,mapstruct不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。
    
    cdi: the generated mapper is an application-scoped CDI bean and can be retrieved via @Inject
    
    spring: 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入
    
    jsr330: 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取。
    
package com.iss.mapper;

import java.util.List;

import org.mybatis.spring.annotation.Mapper;

import com.iss.entity.User;

@Mapper
public interface UserMapper {

    List<User> selectAll();

    void insert(User u);

    void update(User u);

    void deleteById(Integer id);

    User selectById(Integer id);

    List<User> selectByAccountAndPwd(String account, String pwd);

}

4、UserMapper.xml:
在mybatis的配置文件中:
使用< resultMap type=”” id=”“>设置结果集的类型和id 例如:

    <resultMap type="com.iss.entity.User" id="BaseResultMap">
        <id column="id" property="id" />
        <result column="account" property="account" />
        <result column="pwd" property="pwd" />
        <result column="phoneNumber" property="phoneNumber" />
        <result column="email" property="email" />
    </resultMap>

使用< sql >可以标识常用的属性例如:

<sql id="Base_Column_List">
        id,account,pwd,phoneNumber,email
    </sql>

使用select、insert、delete、update等标签配置对应的行为 属性parameterType为传入参数的类型,resultMap为结果集的id,id为在UserMapper中定义的函数名字,
例如:

<select id="selectById" parameterType="Integer" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"></include>
        from t_user where
        id = #{id}
    </select>

注意: 当传进的参数有多个的时候不能通过id = #{id} 的形式进行取值,应用序号的形式进行赋值:account = #{0} and pwd = #{1}

下面为完整的配置源码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.iss.mapper.UserMapper">
    <resultMap type="com.iss.entity.User" id="BaseResultMap">
        <id column="id" property="id" />
        <result column="account" property="account" />
        <result column="pwd" property="pwd" />
        <result column="phoneNumber" property="phoneNumber" />
        <result column="email" property="email" />
    </resultMap>
    <sql id="Base_Column_List">
        id,account,pwd,phoneNumber,email
    </sql>
    <select id="selectAll" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"></include>
        from t_user
    </select>
    <insert id="insert" parameterType="com.iss.entity.User">
        insert into t_user
        (account,pwd,phoneNumber,email)
        values(#{account},#{pwd},#{phoneNumber},#{email})
    </insert>
    <update id="update" parameterType="com.iss.entity.User">
        update t_user set account =
        #{account},pwd=#{pwd},phoneNumber=#{phoneNumber},email=#{email} where
        id =#{id}
    </update>
    <!-- 函数名 类型 -->
    <delete id="deleteById" parameterType="Integer">
        delete from t_user where
        id = #{id}
    </delete>
    <select id="selectById" parameterType="Integer" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"></include>
        from t_user where
        id = #{id}
    </select>
    <select id="selectByAccountAndPwd" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"></include>
        from t_user
        where account = #{0} and pwd = #{1}
    </select>


</mapper>