JavaEE精选-MVC

简介: JavaEE精选-MVC

MVC

JSON

json是js中的对象,主要作为数据交换的格式,运用在客户端与服务器通信的过程中

json就是对于key=value类型数据格式的补充

使用

{}表示的是一个对象

[]表示的是一个数组、集合

var country = {name:"中国", province:[{name:"黑龙江", cities:["哈尔滨","大庆"]},{name:"广东", cities:["广州","深圳"]},{name:"台湾", cities:["台北","高雄"]}]}
var country ={
            "name":"中国",
             "province":[{"name":"黑龙江",”cities”:["哈尔滨","大庆"]},
              {"name":"广东","cities":["广州","深圳","珠海"]},
              {"name":"台湾","cities":["台北","高雄"]},
              {"name":"新疆","cities":["乌鲁木齐"]}]}

成员变量不加引号,说明表示的是json对象,加上了引号表示的就是字符串

两者之间的关系类似于对象和tostring

一般在数据交换的时候使用的是json字符串,传输在请求体中

JAVA对象和JSON字符串之间的转换

借助第三方API来完成,Gson:api简单

实质上就是java对象的tostring变成了json的形式

如果对象中的属性为null,那么gson会自动判断,不会转换为null的数据

单个对象转JSON
public void testJavaToJson(){
    User zs = new User();
    zs.setAge(24);
    zs.setUsername("zhangsan" );
    Gson gson = new Gson();
    String s = gson.toJson(zs);
    System.out.println(s);
}
List中存放的对象转Json
List<User> list = new ArrayList<>();
        list.add(zs);
        list.add(ls);
        list.add(wu);
        Gson gson = new Gson();
        String s = gson.toJson(list);
        System.out.println(s);

本质上都是一样的,toJson里面可以传Object,传List进去也是可以的

Json转成单个对象

调用fromJson方法,第一个参数是要转换的字符串,第二个参数是转换对象的字节码文件

String jsonStr = "{\"username\":\"zhangsan\",\"age\":24}";
        Gson gson = new Gson();
        User user = gson.fromJson(jsonStr, User.class);
        System.out.println(user);
Json转为多个对象数组
String jsonStr = "[{\"username\":\"zhangsan\",\"age\":24},{\"username\":\"lisi\",\"age\":25}]";
Gson gson = new Gson();
JsonParser jsonParser = new JsonParser();
JsonElement parse = jsonParser.parse(jsonStr);
JsonArray asJsonArray = parse.getAsJsonArray();
for (JsonElement jsonElement : asJsonArray) {
    User user = gson.fromJson(jsonElement, User.class);
    System.out.println(user);
}

步骤:1.首先创建一个Gson解析器对象

2.创建自定义的一个解析格式,JsonParser

3.使用JsonParser对字符串进行解析,调用的是parse方法,里面传入要解析的字符串

4.解析完毕后调用指定的方法得到想要的格式, parse.getAsJsonArray()

5.得到的是一个Json数组,最后还需要对具体的每个元素进行解析得到我们想要的对象

5.最后输出即可

整合Maven与EE

1.src\main目录下新建webapp目录

2.设置webapp为应该根目录的映射


3.pom.xml文件设置

<packaging>war</packaging>

4.导包

servlet包—provided,因为只需要编译通过即可,tomcat内部有自带的

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

servlet-provided

junit-test

mysql-connector-java-runtime

注册登录案例

接口

如果需要代码变更较少,那么就需要采取接口编程的方式

接口的优势:制定方法的规范

方法的名称相同、方法的参数相同、方法的返回值类型相同

那么具体的逻辑可以根据不同的需求,生成不同的子实现,这样在更换需求的时候就只需要改变子实现的名称,更换的代价非常小

三层架构

展示层—Controller

业务层—Service

数据层—Dao

在Controller和Dao之间引入service层,使用接口来制定规范,并在具体的实现类中调用方法,以实现不同的功能

这样在使用的时候就只需要使用service即可,具体的操作方法都放在service里面,降低耦合率

在本案例中的具体思路:

展示层—>Controller—>Servlet

用于处理分发方法,只实现展示的业务逻辑,耦合service,通过service来调用方法得到返回的状态码,以此展示不同的页面

UserService userService = new UserServiceImpl(); 
• 1
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String requestURI = request.getRequestURI(); //首先分发请求
    String op = requestURI.replace(request.getContextPath() + "/user/", "");//替换,取出分发的部分
    if ("register".equals(op)){
        register(request,response); //处理注册的逻辑
    }else if ("login".equals(op)){
        login(request,response);
    }
}
private void register(HttpServletRequest request, HttpServletResponse response) throws IOException {
    User registerUser = new User(); //存放新注册的用户
    //从表单中获取数据,然后使用BeanUtils来封装
    try {
        BeanUtils.populate(registerUser,request.getParameterMap());//对数据进行封装
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    //参数校验
    if (StringUtils.isEmpty(registerUser.getUsername())||StringUtils.isEmpty(registerUser.getPassword())||StringUtils.isEmpty(registerUser.getGender())){
        response.getWriter().println("参数为空!请检查数据是否正常");
        return;
    }
    int result = userService.register(registerUser); //得到返回的状态码
    if (result==404){
        response.getWriter().println("当前用户名已经被注册!");
        return;
    }else if (result==500){
        response.getWriter().println("服务器繁忙");
    }
    response.getWriter().println("注册成功!");
}

业务层—Service—

通过接口来制定具体执行的方法的规范,在实现类中与Dao耦合,执行具体的业务逻辑

public interface UserService {
    int register(User reg);
    int login(User login);
}
public class UserServiceImpl implements UserService {
    private UserDao userDao = new UserSqlDao(); //维护一个userDao,在这里面调用方法
    @Override
    public int register(User reg) {
        return userDao.register(reg);
    }
    @Override
    public int login(User login) {
        return userDao.login(login);
    }
}

数据层—Dao

同样的以接口为标准,这样在更换Service中方法的时候代价最小

public interface UserDao {
      int register(User user);
      int login(User login);
}
public class UserSqlDao implements UserDao {
    static SqlSession sqlSession;
    static UserMapper mapper;
    static {
        sqlSession = MyBatisUtil.getSqlSession();
        mapper = sqlSession.getMapper(UserMapper.class);
    }
    @Override
    public int register(User user) {
        try {
            mapper.insertInUser(user);
            sqlSession.commit(); //插入成功需要提交事务
            return 200; //正常插入说明成功,返回200
        }catch (Exception e){
            return 404; //如果用户名存在,那就说明插入失败,会报错,返回404
        }
    }
    @Override
    public int login(User login) {
        return 0;
    }
}
sqlSession.commit(); //插入成功需要提交事务
        return 200; //正常插入说明成功,返回200
    }catch (Exception e){
        return 404; //如果用户名存在,那就说明插入失败,会报错,返回404
    }
}
@Override
public int login(User login) {
    return 0;
}

}

目录
相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
32689 78
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17740 19
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36674 19
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24753 14
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36657 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29834 52

热门文章

最新文章

下一篇
开通oss服务