背景:测试接口的时候,经常都是后端get\post请求直接返回json结果集,很想知道实现方式,虽然心中也大概了解如何实现,但还不如自己来一遍踏实!

先来看一下结果吧:

以下对一个web的get接口进行解析:

一、分层架构图:因都是老生常谈,具体不详解,我的层级分的很清楚,数据读mysql库,理论上有基础的都看得懂

二、代码展示

(1)工具类-数据源连接

package util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; /*
* DAO层的工具类-读取数据库文件生成实例
*/
public class ConfigManager {
private static ConfigManager configManager;
private static Properties properties = null;
//构造方法私有化,用单例模式,一生成实例,就加载data.properties
private ConfigManager(){
properties = new Properties();
InputStream is = ConfigManager.class.getClassLoader().getResourceAsStream("data.properties");
try {
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//生成实例
public static ConfigManager getInstance(){
if(configManager==null){
configManager = new ConfigManager();
}
return configManager;
}
//得到属性值的方法
public static String getValue(String key){
return properties.getProperty(key); }
}

ConfigManager只是为了读取data.properties文件中的各个数据源配置的值

jdbc.driver_class=com.mysql.jdbc.Driver
jdbc.connection.url=jdbc\:mysql\://127.0.0.1\:3306/test?characterEncoding\=UTF-8
jdbc.connection.username=root
jdbc.connection.password=root
package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; /*
* 基类:获取数据库连接及关闭连接、数据库增删改和查询 工具类
* 对数据库的基本操作
*/
public class BaseDao {
private Connection connection=null;
private PreparedStatement pstm =null;
private ResultSet resultset = null;
//获取数据库连接
public boolean getconnection(){
boolean flag =false;
String driver = ConfigManager.getInstance().getValue("jdbc.driver_class");
String url = ConfigManager.getInstance().getValue("jdbc.connection.url");
String username = ConfigManager.getInstance().getValue("jdbc.connection.username");
String password = ConfigManager.getInstance().getValue("jdbc.connection.password");
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, username, password);
flag = true;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} return flag; }
//增、删、改操作
public int executeUpdate(String sql,Object[] params){
int update = 0;
try {
//预加载sql
pstm = connection.prepareStatement(sql);
for(int i=0;i<params.length;i++){
pstm.setObject(i+1, params[i]);
}
update = pstm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return update; }
//查询操作
public ResultSet executeQuery(String sql,Object[] params){
try {
pstm = connection.prepareStatement(sql);
for(int i=0;i<params.length;i++){
pstm.setObject(i+1, params[i]);
}
resultset = pstm.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return resultset; } /*//模糊查询操作
public ResultSet executeQueryLike(String sql,Object[] params){
try {
pstm = connection.prepareStatement(sql);
for(int i=0;i<params.length;i++){
pstm.setObject(i+1, "%"+params[i]+"%");
}
resultset = pstm.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return resultset; }*/ //关闭连接
public void clossconnection(){
if(resultset!=null){
try {
resultset.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstm!=null){
try {
pstm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

真正获取数据库连接,把增删除改查的方法集成工具类的,还得看BaseDao,你也可以一个java一锅炖,获取data.properties值,然后用到什么写什么

(2)dao和dao.impl

package dao;

import java.util.List;

import entity.News;

/**
* new表实现接口
* @author 0
*
*/
public interface NewsDao {
public List<News> getrows(String where);
} ----------------------------
package dao.impl; import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List; import util.BaseDao; import dao.NewsDao;
import entity.News;
/**
* dao实现类
* @author 0
*
*/
public class NewsDaoImpl extends BaseDao implements NewsDao {
@Override
public List<News> getrows(String where) {
List<News> listnews=new ArrayList<News>();
News news=null;
String sql="select id,title,createdate,createby,url from news where 1=1 "+where;
Object[] params={};
System.out.println("sql==="+sql);
if(this.getconnection()){
ResultSet rs = this.executeQuery(sql, params);
try {
while(rs.next()) {
news = new News();
int id = rs.getInt("id");
String title = rs.getString("title");
Timestamp createdate = rs.getTimestamp("createdate");
String createby=rs.getString("createby");
String url=rs.getString("url");
news.setId(id);
news.setTitle(title);
news.setCreatedate(createdate);
news.setCreateby(createby);
news.setUrl(url);
listnews.add(news);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return listnews;
} }

备注:这里要注意的是select最好写自己想要的字段,而不要写*

(3)service与service.impl

package service;

import java.util.List;

import entity.News;

public interface NewsService {
public List<News> getrows(String where);
} -------------------------------------------------------------
package service.impl; import java.util.List; import dao.NewsDao;
import dao.impl.NewsDaoImpl; import entity.News;
import service.NewsService; public class NewsServiceImpl implements NewsService { private NewsDao newsdao=new NewsDaoImpl();
@Override
public List<News> getrows(String where) {
return newsdao.getrows(where);
} }

备注:可要可不要,我这没什么逻辑,所以可以不用。

(4)json字段

package util;

import java.util.List;

import entity.News;

/**
* 新建分页测试类NewTotal,主要用于Json分页显示
* @author 0
*
*/
public class NewTotal {
private int totle;//总数
private List<News> rows;//新闻列表 public NewTotal() { } public NewTotal(int totle, List<News> rows) {
this.totle = totle;
this.rows = rows;
} public int getTotle() {
return totle;
}
public void setTotle(int totle) {
this.totle = totle;
}
public List<News> getRows() {
return rows;
}
public void setRows(List<News> rows) {
this.rows = rows;
} }

备注:其实这里的2个字段定义,就是页面中出现的2个

(5)servlet

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.google.gson.Gson; import entity.News; import service.NewsService;
import service.impl.NewsServiceImpl;
import util.NewTotal; public class NewsInfoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
NewsService newsService=new NewsServiceImpl();
String createby=request.getParameter("createby");
String page = request.getParameter("page");
String pageSize=request.getParameter("pageSize");
int pageNo=0;//页码
int pageS=0;//页码量
StringBuffer where=new StringBuffer();//where条件查询拼接字符串
//判断页码值或参数存不存在
if(page!=null &&!"".equals(page)){
pageNo=Integer.parseInt(page);
}else{//如果当前页码为空,则默认出第1页
pageNo=1;
}
if(pageSize!=null &&!"".equals(pageSize)){
pageS=Integer.parseInt(pageSize);
}else{//如果页码容量为空,则默认出一页10条
pageS=10;
}
//判断创建者参数是否为空,并拼接字符串查询
if(createby!=null &&!"".equals(createby)){
where.append(" and createby like '%"+createby+"%'");
}
//如果页码值存在,页码容量不存在
if(pageNo>0 &&(pageSize==null &&"".equals(pageSize))){
where.append(" limit "+(pageNo-1)*10+",10");
System.out.println("第1");
}
//如果页码值存在,页码容量存在:实际上完全为空的情况已经排除掉了,如果都存在肯定则可能输入默认的情况
if(pageNo>0 && pageS>0){
where.append(" limit "+(pageNo-1)*pageS+","+pageS);
System.out.println("第2");
}
//如果页码值不存在,页码容量存在
if((page==null &&"".equals(page)) && pageS>0 ){
where.append(" limit 1,"+pageS);
System.out.println("第3");
}
System.out.println(where.toString());
List<News> listn=newsService.getrows(where.toString());
int totalCount=listn.size();//总量
//新数据封装到新闻总计类中
NewTotal nt=new NewTotal(totalCount, listn);
//调用Gson
Gson gson=new Gson();
String json=gson.toJson(nt); //输出到界面
System.out.println(json);
response.setCharacterEncoding("text/plain");
response.setCharacterEncoding("utf-8");
PrintWriter out =new PrintWriter(response.getOutputStream());
out.print(json);
out.flush();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

备注:就这个想了一下,因为条件会比较多,各样条件,也有可能不是太充分有考虑,遇到bug再加吧~~~(我们这的开发都是这样的水平,哈哈)

(6)jsp页面与web.xml

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
This is my JSP page. <br>
<form action="getJson" method="get">
<!-- <input type="submit" value="点击获取新闻JSON数据"/> -->
</form>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>NewsInfoServlet</servlet-name>
<servlet-class>servlet.NewsInfoServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>NewsInfoServlet</servlet-name>
<url-pattern>/newsInfoServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <servlet>
<servlet-name>JsonServlet</servlet-name>
<servlet-class>servlet.NewsInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JsonServlet</servlet-name>
<url-pattern>/getJson</url-pattern>
</servlet-mapping>
</web-app>

其实上面这个例子非常之简单,有一段时间没有碰代码了,写起来费了点时间,不过很多都是找旧代码拷过来的。

常时间不写代码就是这么生疏!!

ps:我的servlet写的都挺顺手,但是框架不行~框架不行~框架不行~~~

根据URL获取参数值得出json结果集,对外给一个接口让别人调用的更多相关文章

  1. java接口对接——别人调用我们接口获取数据

    java接口对接——别人调用我们接口获取数据,我们需要在我们系统中开发几个接口,给对方接口规范文档,包括访问我们的接口地址,以及入参名称和格式,还有我们的返回的状态的情况, 接口代码: package ...

  2. JMeter使用JSON Extractor插件实现将一个接口的JSON返回值作为下一个接口的入参

    ##补充## 接口响应数据,一般为JSON,HTML格式的数据. 对于HTML的响应结果提取,可以使用正则表达式,也可以通过XPath来提取:对于JSON格式的数据,可以用正则表达式,JSON Ext ...

  3. c# 通过URl 获取返回的json格式数据

    方法一 http://blog.csdn.net/angle_greensky110/article/details/52209497 protected string GetJson(string ...

  4. js通过html的url获取参数值

    function getUrlParameter(name){ name = name.replace(/[]/,"\[").replace(/[]/,"\[" ...

  5. SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析

    SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析 一:问题demo展示 ...

  6. 解析URL 获取某一个参数值

    /** * 解析URL 获取某一个参数值 * * @param name 需要获取的字段 * @param webaddress URL * * @return 返回的参数对应的 value */ - ...

  7. java根据url获取json对象

    package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; ...

  8. 获取url地址参数值

    获取url地址参数值方法: function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + &q ...

  9. js使用正则表达式从url中获取参数值

    //从url中获取参数值 function getvl(name) { var reg = new RegExp("(^|\\?|&)"+ name +"=([^ ...

随机推荐

  1. Gartner 2018新技术成熟度曲线

    https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/82047719 近日,Gartner发布了2018年新技术成熟度曲线,首次将生物 ...

  2. Redhat系统部署安装Splunk

    一.下载安装包 可以从国内网站进入:http://10data.com/splunk/ 下载前需要注册一个splunk账号,注册后便可以提供下载,安装包名称:splunklight-6.5.1-f74 ...

  3. linux命令(44):sed,vim;去掉文件中的^M 符号,去掉行首空格和制表符

    注:下面的直接粘贴会出错,要重新输入^M 如何输入^M,先 ctrl+v,然后 ctrl+m 第一种方法: cat -A filename 就可以看到windows下的断元字符 ^M要去除他,最简单用 ...

  4. 20、uwp打包失败(All app package manifests in a bundle must declare the same values under the XPath *[local-name()='Package']/*[local-name()='Dependencies'])

    在给 uwp工程打商店包的时候,遇到了一个异常: Error info: error 80080204: All app package manifests in a bundle must decl ...

  5. 【转】提交http请求之python与curl

    提交http请求之python与curl 由于Openstack是python实现wsgi的REST ful架构,在学习和调试的过程中,常常会遇到http请求的提交,于是顺手整理下python和cur ...

  6. 系统清理工具CCleaner被植入后门

    概述 2017年9月18日,有情报披露,著名的系统优化工具CCleaner的某个版本被发现植入后门,大量使用该工具的用户恐将面临泄密风险.这是继Xshell后门事件后,又一起严重的软件供应链来源攻击事 ...

  7. (转载)跟我一起学习VIM - The Life Changing Editor

    原文: http://ju.outofmemory.cn/entry/79671 前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教程.虽然准备有限,但分享过程中大家大多带着一种 ...

  8. JAVA-数据库之删除记录

    相关资料:<21天学通Java Web开发> 删除记录 Statementdelete.jsp <%@ page language="java" contentT ...

  9. java判断是移动端还是pc端

    // \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔), // 字符串在编译时会被转码一次,所以是 "\\b" // \B 是单词内部逻辑间隔(连着的 ...

  10. You have not concluded your merge (MERGE_HEAD exists) git拉取失败

    本文转自:http://yijiebuyi.com/blog/5b55eb51ad49ce41e2de9c85dd4513ca.html 今天获取git线上仓库代码报了这个错误: zhangzhi@m ...