背景:测试接口的时候,经常都是后端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. HAProxy压测及参数调优

    背景 小米容器云平台,在构建云厂商集群时,需要通过HAProxy将云厂商LB流量从宿主机转到容器中,但对于HAProxy的性能没有把握.参考网上的一篇HAProxy压测文章,文章中提到HAProxy ...

  2. [CoreOS 转载]CoreOS实践指南(二):架设CoreOS集群

    转载:http://www.csdn.net/article/2015-01-04/2823399 摘要:CoreOS是一个采用了高度精简的系统内核及外围定制的操作系统.ThoughtWorks的软件 ...

  3. 【嵌入式】FS2410移植U-Boot-1.1.6

    移植环境 硬件平台:FS2410 U-Boot版本:u-boot-1.1.6 编译器:arm-linux-gcc version 3.4.1 U-Boot主要目录结构    U-Boot的 stage ...

  4. kkpager的改进,Ajax数据变化但是页码不变的有关问题

    kkpager的改进,Ajax数据变化但是页码不变的问题kkpager 是一个简单分页展示插件,需要依赖jquery.下载地址:http://www.oschina.net/action/projec ...

  5. 【Python】微博自动抢红包

    # -*- coding: utf-8 -*- import requests import js2xml from lxml import etree headers = { # 这边cookie替 ...

  6. DjangoUeditor 使用七牛云存储

    DjangoUeditor 是一个相当赞的django 富文本编辑器,你可以在 https://github.com/zhangfisher/DjangoUeditor 查看相关信息. 我一直想着把D ...

  7. 如何搭建iOS项目基本框架

    今天我们来谈谈如何搭建框架,框架需要做一些什么. 第一步:找到我们的目标我们的目标是让其他开发人员拿到手后即可写页面,不再需要考虑其他的问题. 第二步:我们需要做哪些东西各位跟着我一步一步来进行. 假 ...

  8. 算法篇---Shell排序(希尔)算法

    先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至 ...

  9. Android基础——Fragment控制切换多个页面

    今天接着上一篇文章,讲解一下Fragment的控制,主要是切换View和页面替换等操作.还有就是如何获取Fragment的管理对象,以及与Activity的通信方式. (PS:新建的QQ群,有兴趣可以 ...

  10. [转]MySQL DATE_FORMAT() 函数

    原文地址:http://www.w3school.com.cn/sql/func_date_format.asp 定义和用法 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 语法 ...