海南彩票网站开发,黑龙江建设网站招聘,网站建设纯免费官网,android wap网站目录
HttpServlet
HttpServletRequest HttpServletResponse
错误页面
设置网页自动刷新时间
构造重定向相应
js发起http请求
服务器端对js发起的http请求进行处理
前端获取后端数据#xff0c;添加到当前页面的末尾#xff0c;代码示例#xff1a; 前后端交互添加到当前页面的末尾代码示例 前后端交互引入数据库存储数据
1引入数据库依赖
编辑
编辑2建库建表
3编写数据库代码
整体代码
利用Cookie和Session实现登录逻辑
1.登录页面html
2.通过一个Servlet处理上述的登录请求
3.网站主页通过另一个servlet生成的动态页面 掌握如下三个类就可以完成Servlet的大部分开发了
HttpServletHttpServletRequestHttpServletResponse
URI唯一资源标识符
URL唯一资源定位/地址符
HttpServlet
HttpServlet继承这个类重写里面的方法目的就是为了把咱们子集定义的代码“插入到”tomcat中HttpServlet的常用方法如下 方法名称 调用时机 init 在 HttpServlet 实例化之后被调用一次初始化 destory 在 HttpServlet 实例不再使用的时候调用一次释放资源 service 收到 HTTP 请求的时候调用 doGet 收到 GET 请求的时候调用 ( 由 service 方法调用 ) doPost 收到 POST 请求的时候调用 ( 由 service 方法调用 ) doPut/doDelete/doOptions/... 收到其他请求的时候调用 ( 由 service 方法调用 ) 我们实际开发的时候主要重写 doXXX 方法 , 很少会重写 init / destory / service init还是比较有用的service一般会doGet/doPost替代destory一般用不上说了不算算了不说因为一个Servlet不用了说明Tomcat要关闭了而Tomcat关闭有两种方式 直接干掉Tomcat进程完全来不及调用destory的通过8005管理端口给Tomcat发送一个“停机”指令这个时候是能够执行destory的。
init / destory / service 这三个方法都不需要手动调用会被tomcat在合适的时机自动调用咱们写好代码让别人来帮忙调用这种方式就叫做 “框架” 也就是一个程序的主体部分都已经被其他大佬们写完了有些细节内容允许咱们插入咱们自己写的自定义的逻辑.
HttpServletRequest 当 Tomcat 通过 Socket API 读取 HTTP 请求 ( 字符串 ), 并且按照 HTTP 协议的格式把字符串解析成 HttpServletRequest 对象 . 核心方法 方法 描述 String getProtocol() 返回请求协议的名称和版本。 String getMethod() 返回请求的 HTTP 方法的名称例如 GET 、 POST 或 PUT 。 String getRequestURI() 从协议名称直到 HTTP 请求的第一行的查询字符串中返回该 请求的 URL 的一部分。 String getContextPath() 返回指示请求上下文的请求 URI 部分。 String getQueryString() 返回包含在路径后的请求 URL 中的查询字符串。 InputStream getInputStream() 用于读取请求的 body 内容 . 返回一个 InputStream 对象 . Enumeration getParameterNames() 返回一个 String 对象的枚举包含在该请求中包含的参数的名 称。 String getParameter(String name) 以字符串形式返回请求参数的值或者如果参数不存在则返回 null 。 String[] getParameterValues(String name) 返回一个字符串对象的数组包含所有给定的请求参数的值 如果参数不存在则返回 null 。 Enumeration getHeaderNames() 返回一个枚举包含在该请求中包含的所有的头名。 String getHeader(String name) 以字符串形式返回指定的请求头的值。 String getCharacterEncoding() 返回请求主体中使用的字符编码的名称。 String getContentType() 返回请求主体的 MIME 类型如果不知道类型则返回 null 。 int getContentLength() 以字节为单位返回请求主体的长度并提供输入流或者如果 长度未知则返回 -1 。 上述的方法都是get系列方法都是读方法没有set系列没有写方法当前拿到的HttpServletRequest这些数据的内容已经确定下来了程序员是不应该修改的. 前端将数据交给后端 除了query string之外还可以通过http请求的body来传递参数POST。 1直接通过form表单 body的格式就是query string的格式 Content-Typeapplication/x-www-form-urlencoded 2直接使用json body的格式就是json Content-Typeapplication/json 这三种方式本质上是等价的都是把键值对数据交给服务器前两种方法servlet天然支持的json这种方法需要引入第三方库。 在java中json的第三方库是非常多的这里我们使用jacksonjackson是spring官方推荐的库也被spring集成起来了 步骤如下 1下载导入jackson到项目中通过maven Maven Repository: Search/Browse/Explore (mvnrepository.com) 2使用jackson 一个类两个方法 ObjectMapper 把json字符串映射成java的一个对象read方法把一个java对象映射成json字符串write方法 Request request objectMapper.readValue(req.getInputStream(),Request.class); 1.核心工作就是把json字符串映射成java 对象参数就是json字符串json字符串是在http的body中的就需要通过HttpServletRequest中的getInputStream来获取到 此处把这个流对象直接传给readValuereadValue内部就会读取InputStream中的所有数据http请求的body也就是json字符串进一步尝试解析 2.按照json的格式进行解析把json字符串解析成map键值对 3.把map转换成对象在方法的第二个参数 如下示例
import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.ObjectInputValidation;class Request()
{public String username;public String password;
}
class Response{public boolean ok;
}WebServlet(/json)
public class JsonParameterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ObjectMapper objectMapper new ObjectMapper();Request request objectMapper.readValue(req.getInputStream(),Request.class);System.out.println(usernamerequest.username);System.out.println(passwordrequest.password);Response responsenew Response();response.oktrue;//把响应对象转成json字符串String respJsonobjectMapper.writeValueAsString(response);resp.setContentType(application/json;charsetutf8);resp.getWriter().write(respJson);}
}HttpServletResponse Servlet 中的 doXXX 方法的目的就是根据请求计算得到相应 , 然后把响应的数据设置到 HttpServletResponse 对象中 . 然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式 , 转成一个字符串 , 并通过 Socket 写回给浏览器 . 核心方法 方法 描述 void setStatus(int sc) 为该响应设置状态码 void setHeader(String name, String value) 设置一个带有给定的名称和值的 header. 如果 name 已经存在 , 则覆盖旧的值 void addHeader(String name, String value) 添加一个带有给定的名称和值的 header. 如果 name 已经存在 , 不覆盖旧的值, 并列添加新的键值对 void setContentType(String type) 设置被发送到客户端的响应的内容类型。 void setCharacterEncoding(String charset) 设置被发送到客户端的响应的字符编码 MIME 字符集例如UTF-8 void sendRedirect(String location) 使用指定的重定向位置 URL 发送临时重定向响应到客户端 PrintWriter getWriter() 用于往 body 中写入文本格式数据 OutputStream getOutputStream() 用于往 body 中写入二进制格式数据
错误页面 resp.sendError(404,这个页面是一个错误页面) 设置网页自动刷新时间 resp.setHeader(refresh,1); 构造重定向相应 resp.setStatus(302);
resp.setHeader(Location,https://www.baidu.com);header需要有一个Location属性描述要跳转到哪里 除了这种写法外还有如下另一种方法 resp.sendRedirect(https://www.baidu.com); 使用ajax需要先引入JQeury第三方库 jquery (v3.7.1) - jQuery 是一个高效、精简并且功能丰富的 JavaScript 工具库。它提供的 API 易于使用且兼容众多浏览器这让诸如 HTML 文档遍历和操作、事件处理、动画和 Ajax 操作更加简单。 | BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务https://www.bootcdn.cn/jquery/ 链接如上选择如下链接 在script标签引入jquery script srchttps://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js/script js发起http请求 // 把用户填写的内容发送给服务器让服务器来保存// $ 是jquery提供的全局变量ajax是$的一个方法// ajax的参数是一个js对象可以有很多属性let body{from:from,to:to,message:message}//上述body是一个js对象还需要转换成json字符串let jsonString JSON.stringify(body)$.ajax({type:post,url:message,contentType:application/json; charsetutf8,data:jsonString,//这里的body与上面的body不是同一个是响应报文的正文success:function(body){// 这个回调就是收到响应之后要执行的代码了}});
此处success回调函数不是立即执行的而是在浏览器收到服务器返回的成功这样的响应的时候才会执行function 这个函数的第一个参数是响应数据的body中的内容。
服务器端对js发起的http请求进行处理
import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;class Message{
// 确保java代码中类的属性名字和json中的属性名字保持一致才能够自动填充public String from;public String to;public String message;Overridepublic String toString() {return Message{ from from \ , to to \ , message message \ };}
}
WebServlet(/message)
public class MessageServlet extends HttpServlet {private ObjectMapper objectMapper new ObjectMapper();private ListMessage messageList new ArrayList();Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//使用jackson读取前端发来的数据把这个数据保存到服务器这边Message message objectMapper.readValue(req.getInputStream(),Message.class);System.out.println(请求中收到的message message);//保存数据最简单的是直接内存中存储使用集合类//但是这样做一旦重启服务器一切数据都没有了一般存储到数据库中messageList.add(message);//返回一个响应resp.setStatus(200);resp.getWriter().write(ok);}
}这里启动服务器后不能直接访问/message需要访问.html路径 当浏览器要向服务器获取资源 服务器方使用List类型的数组存储历史数据转成的json字符串就是一个json数组jackson自动遍历List里的每个元素把每个元素分别转成json字符串。 Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(200);resp.setContentType(application/json;charsetutf-8);String respJson objectMapper.writeValueAsString(messageList);resp.getWriter().write(respJson);}
上述代码setStatus和setContentType必须在getWriter前面否则不会生效 $.ajax{ type:get, url:message, success:function(body){ //处理服务器返回的响应数据。(json格式的数组) } } //当响应中header带有ContentTypeapplication/json,JQuery就会自动把json字符串解析成js对象了如果没有带ContentTypeapplication/json就需要通过js代码JSON.parse方法手动把json字符串转成js对象 前端获取后端数据添加到当前页面的末尾代码示例 $.ajax{type:get,url:message,success:function(body){//处理服务器返回的响应数据。(json格式的数组)//由于响应中已经有ContentTypeapplication/json了就不需要使用parse方法手动转换了//body JSON.parse(body);//拿到 container这个元素let containerDiv document.querySelector(.container);//处理服务器返回的响应数据。json格式的数组了for(let i0;ibody.length;i){//body是一个数组此时的message也就是js对象了//这个message对象里有三个属性from、to、messagelet message body[i];//根据message对象构建html片段把这个片段给显示到网页上//createElement 方法就能构造一个html标签//此时就得到了div/divlet div document.createElement(div);//还需要给这个div设置一个属性div.className row;//设置内容div.innerHTML message.from 对 message.to 说 message.message;//将这个div添加到containerDiv末尾containerDiv.appendChild(div);}} 前后端交互引入数据库存储数据
1引入数据库依赖
Maven仓库链接
Maven Repository: Search/Browse/Explore (mvnrepository.com)
搜索MySQL选择如下 这里选择5.1.47版本 复制如下代码 复制到pom.xml里 2建库建表
create database if not exists message_wall charset utf8;
use message_wall;
-- 删表的目的是为了防止之前数据库里有一样的表
drop table if exists message;
use message_wall;
create table message(from varchar(1024),to varchar(1024),message varchar(1024));
3编写数据库代码
// 1. 创建数据源
private DataSource dataSource new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl(jdbc:mysql://127.0.0.1:3307/message_wall?characterEncodingutf8useSSLfalse);
((MysqlDataSource) dataSource).setUser(root);
((MysqlDataSource) dataSource).setPassword(root);
// 2. 建立连接
Connection connection dataSource.getConnection();// 3. 构造 SQL
String sql insert into message values(?, ?, ?);
PreparedStatement statement connection.prepareStatement(sql);
statement.setString(1, message.from);
statement.setString(2, message.to);
statement.setString(3, message.message);// 3. 执行 SQL
statement.executeUpdate();// 4. 回收资源
statement.close();
connection.close();
整体代码
MessageServlet.java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;class Message {public String from;public String to;public String message;Overridepublic String toString() {return Message{ from from \ , to to \ , message message \ };}
}WebServlet(/message)
public class MessageServlet extends HttpServlet {private ObjectMapper objectMapper new ObjectMapper();// 引入数据库, 此时 messageList 就不再需要了.// private ListMessage messageList new ArrayList();private DataSource dataSource new MysqlDataSource();Overridepublic void init() throws ServletException {// 1. 创建数据源((MysqlDataSource) dataSource).setUrl(jdbc:mysql://127.0.0.1:3307/message_wall?characterEncodingutf8useSSLfalse);((MysqlDataSource) dataSource).setUser(root);((MysqlDataSource) dataSource).setPassword(root);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 读取前端发来的数据, 把这个数据保存到服务器这边.Message message objectMapper.readValue(req.getInputStream(), Message.class);System.out.println(请求中收到的 message: message);// 最简单的办法, 直接在内存中保存. 可以使用一个集合类, 把所有收到的 message 都存到内存中.// 很明显, 保存到内存, 并非是一个非常合理的办法. 后续一旦重启服务器, 数据丢失了.// 相比之下, 把这个数据持久化存储到数据库中, 更科学的.// messageList.add(message);// 插入数据库try {save(message);} catch (SQLException e) {throw new RuntimeException(e);}// 返回一个响应resp.setStatus(200);resp.getWriter().write(ok);// resp.setContentType(application/json);// resp.getWriter().write({ ok: true });}Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 通过这个方法来处理当前获取消息列表的 get 请求. 不需要解析参数, 直接返回数据即可.resp.setStatus(200);resp.setContentType(application/json; charsetutf8);// 从数据库查询ListMessage messageList null;try {messageList load();} catch (SQLException e) {throw new RuntimeException(e);}String respJson objectMapper.writeValueAsString(messageList);resp.getWriter().write(respJson);}private void save(Message message) throws SQLException {// 通过这个方法把 message 插入到数据库中// 1. 建立连接Connection connection dataSource.getConnection();// 2. 构造 SQLString sql insert into message values(?, ?, ?);PreparedStatement statement connection.prepareStatement(sql);statement.setString(1, message.from);statement.setString(2, message.to);statement.setString(3, message.message);// 3. 执行 SQLstatement.executeUpdate();// 4. 回收资源statement.close();connection.close();}private ListMessage load() throws SQLException {// 通过这个方法从数据库读取到 message.// 1. 建立连接Connection connection dataSource.getConnection();// 2. 构造 SQLString sql select * from message;PreparedStatement statement connection.prepareStatement(sql);// 3. 执行 sqlResultSet resultSet statement.executeQuery();// 4. 遍历结果集合ListMessage messageList new ArrayList();while (resultSet.next()) {Message message new Message();message.from resultSet.getString(from);message.to resultSet.getString(to);message.message resultSet.getString(message);messageList.add(message);}// 5. 回收资源resultSet.close();statement.close();connection.close();// 6. 返回 messageListreturn messageList;}
}message_wall.html
!DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0title表白墙/titlestyle/* * 通配符选择器, 是选中页面所有元素 */* {/* 消除浏览器的默认样式. */margin: 0;padding: 0;box-sizing: border-box;}.container {width: 600px;margin: 20px auto;}h1 {text-align: center;}p {text-align: center;color: #666;margin: 20px 0;}.row {/* 开启弹性布局 */display: flex;height: 40px;/* 水平方向居中 */justify-content: center;/* 垂直方向居中 */align-items: center;}.row span {width: 80px;}.row input {width: 200px;height: 30px;}.row button {width: 280px;height: 30px;color: white;background-color: orange;/* 去掉边框 */border: none;border-radius: 5px;}/* 点击的时候有个反馈 */.row button:active {background-color: grey;}/stylescript srchttps://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js/script
/head
body
div classcontainerh1表白墙/h1p输入内容后点击提交, 信息会显示到下方表格中/pdiv classrowspan谁: /spaninput typetext/divdiv classrowspan对谁: /spaninput typetext/divdiv classrowspan说: /spaninput typetext/divdiv classrowbutton idsubmit提交/button/div!-- div classrowxxx 对 xx 说 xxxx/div --
/divscript// 实现提交操作. 点击提交按钮, 就能够把用户输入的内容提交到页面上显示.// 点击的时候, 获取到三个输入框中的文本内容// 创建一个新的 div.row 把内容构造到这个 div 中即可.let containerDiv document.querySelector(.container);let inputs document.querySelectorAll(input);let button document.querySelector(#submit);button.onclick function() {// 1. 获取到三个输入框的内容let from inputs[0].value;let to inputs[1].value;let msg inputs[2].value;if (from || to || msg ) {return;}// 2. 构造新 divlet rowDiv document.createElement(div);rowDiv.className row message;rowDiv.innerHTML from 对 to 说: msg;containerDiv.appendChild(rowDiv);// 3. 清空之前的输入框内容for (let input of inputs) {input.value ;}// 4. 把用户填写的内容, 发送给服务器. 让服务器来保存.// $ 是 jquery 提供的全局变量. ajax 就是 $ 的一个方法.// ajax 的参数是一个 js 对象, 可以有很多属性let requestBody {from: from, // from 变量里的值, 就是第一个输入框的内容, 张三to: to, // to 变量的值, 就是第二个输入框的内容, 李四message: msg // msg 变量的值, 就是第三个输入框的内容, 我喜欢你很久了};// 上述 body 是一个 js 对象, 还需要转成 json 字符串.let jsonString JSON.stringify(requestBody);$.ajax({type: post,url: message,contentType: application/json; charsetutf8,data: jsonString,success: function(responseBody) {// 这个回调就是收到响应之后要执行的代码了.// 前端使用 console.log 打印日志到控制台. (chrome 开发者工具的控制台)console.log(responseBody: responseBody);}});}// 直接在 script 里面写的 js 代码, 就是在页面加载时被执行到的.// 发起一个 get 请求, 从服务器获取到数据// get 请求不需要 body, 也就不需要上述 data 和 contentType 属性了.$.ajax({type: get,url: message,success: function(body) {// 由于响应中已经有 Content-Type: application/json 了, 就不需要使用 parse 方法手动转换了.// body JSON.parse(body);// 拿到 container 这个元素let containerDiv document.querySelector(.container);// 处理服务器返回的响应数据. (json 格式的数组了)for (let i 0; i body.length; i) {// body 是一个数组, 此时 message 也就是 js 对象了.// 这个 message 对象里, 有三个属性, from, to, messagelet message body[i];// 根据 message 对象构建 html 片段, 把这个片段给显示到网页上.// createElement 方法就能构造出一个 html 标签.// 此时就得到了 div/divlet div document.createElement(div);// 还需要往里面设置一个 属性 , classrow (设置这个属性, 是为了让 css 能够给这个元素设置一些样式)// 此时就得到了 div classrow/divdiv.className row;// 给这个 div 里设置内容// 此时就得到了 div classrow张三 对 李四 说: 我喜欢你很久了/divdiv.innerHTML message.from 对 message.to 说: message.message;// 把 div 添加到 containerDiv 的末尾containerDiv.appendChild(div);}}});
/script
/body
/html 利用Cookie和Session实现登录逻辑
Cookie是客户端存储数据的机制
Session是服务器存储数据的机制不算持久化存储
1.登录页面html 2.通过一个Servlet处理上述的登录请求
通过这个Servlet读取用户名和密码并且验证是否登录成功。
如果登陆成功就会给当前用户创建一个会话 并且把得到的sessionid通过cooki返回给客户端客户端就把cookie保存起来了。 3.网站主页通过另一个servlet生成的动态页面
在这个页面中就会把刚才这里的用户数据给显示到页面上。 getSessiontrue 这个方法就是根据请求的cookie中的sessionid查询服务器的hash表找到对应的session对象。如果cookie中没有sessionid首次登录的时候就是没有的或者sessionid没有查找到对应的session对象就可以创建出一个session对象出来。 参数为true允许不存在时自动创建false不能创建直接返回null //可以给会话中保存一些自定义的数据通过Attribute的方式来保存
HttpSession session req.getSession(true);
//此处Atrribute也是键值对这里的内容存储什么都可以
session.setAttribute(username,username);
session.setAttribute(loginTime,System.currentTimeMillis());
//此处相当于登录成功让页面跳转网站首页
resp.sendRedirect(index); 此处的getSession会创建新会话 1生成sessionid和HttpSession对象 2把上述sessionid和HttpSession对象保存到内存hash表中 3把sessionid设置到响应报文的header中的 Set-Cookie字段 浏览器拿到响应就会把这个Set-Cookie的内容保存到浏览器的Cookie中 。 文章转载自: http://www.morning.jjpk.cn.gov.cn.jjpk.cn http://www.morning.rwls.cn.gov.cn.rwls.cn http://www.morning.gdgylp.com.gov.cn.gdgylp.com http://www.morning.nyhtf.cn.gov.cn.nyhtf.cn http://www.morning.qgghr.cn.gov.cn.qgghr.cn http://www.morning.bxyzr.cn.gov.cn.bxyzr.cn http://www.morning.qgwpx.cn.gov.cn.qgwpx.cn http://www.morning.jbxmb.cn.gov.cn.jbxmb.cn http://www.morning.sjzsjsm.com.gov.cn.sjzsjsm.com http://www.morning.rcgzg.cn.gov.cn.rcgzg.cn http://www.morning.dodoking.cn.gov.cn.dodoking.cn http://www.morning.mqmmc.cn.gov.cn.mqmmc.cn http://www.morning.hmhdn.cn.gov.cn.hmhdn.cn http://www.morning.ejknty.cn.gov.cn.ejknty.cn http://www.morning.bnbzd.cn.gov.cn.bnbzd.cn http://www.morning.cfjyr.cn.gov.cn.cfjyr.cn http://www.morning.qrsm.cn.gov.cn.qrsm.cn http://www.morning.fdmfn.cn.gov.cn.fdmfn.cn http://www.morning.znlhc.cn.gov.cn.znlhc.cn http://www.morning.fxjnn.cn.gov.cn.fxjnn.cn http://www.morning.bqnhh.cn.gov.cn.bqnhh.cn http://www.morning.pbtrx.cn.gov.cn.pbtrx.cn http://www.morning.tzjqm.cn.gov.cn.tzjqm.cn http://www.morning.gcdzp.cn.gov.cn.gcdzp.cn http://www.morning.pnntx.cn.gov.cn.pnntx.cn http://www.morning.jwmws.cn.gov.cn.jwmws.cn http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn http://www.morning.bntgy.cn.gov.cn.bntgy.cn http://www.morning.httzf.cn.gov.cn.httzf.cn http://www.morning.xxfxxf.cn.gov.cn.xxfxxf.cn http://www.morning.fylsz.cn.gov.cn.fylsz.cn http://www.morning.rcdmp.cn.gov.cn.rcdmp.cn http://www.morning.nslwj.cn.gov.cn.nslwj.cn http://www.morning.ctlbf.cn.gov.cn.ctlbf.cn http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn http://www.morning.bwgrd.cn.gov.cn.bwgrd.cn http://www.morning.cjmmt.cn.gov.cn.cjmmt.cn http://www.morning.lcbgf.cn.gov.cn.lcbgf.cn http://www.morning.rgzc.cn.gov.cn.rgzc.cn http://www.morning.sjzsjsm.com.gov.cn.sjzsjsm.com http://www.morning.nzwp.cn.gov.cn.nzwp.cn http://www.morning.xpmhs.cn.gov.cn.xpmhs.cn http://www.morning.ttdxn.cn.gov.cn.ttdxn.cn http://www.morning.drbwh.cn.gov.cn.drbwh.cn http://www.morning.rgyts.cn.gov.cn.rgyts.cn http://www.morning.xcjwm.cn.gov.cn.xcjwm.cn http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn http://www.morning.enjoinfo.cn.gov.cn.enjoinfo.cn http://www.morning.ykrkb.cn.gov.cn.ykrkb.cn http://www.morning.ygrdb.cn.gov.cn.ygrdb.cn http://www.morning.lltdf.cn.gov.cn.lltdf.cn http://www.morning.zzqgc.cn.gov.cn.zzqgc.cn http://www.morning.kcypc.cn.gov.cn.kcypc.cn http://www.morning.jxrpn.cn.gov.cn.jxrpn.cn http://www.morning.yxwcj.cn.gov.cn.yxwcj.cn http://www.morning.txgjx.cn.gov.cn.txgjx.cn http://www.morning.kflzy.cn.gov.cn.kflzy.cn http://www.morning.gnbtp.cn.gov.cn.gnbtp.cn http://www.morning.c7497.cn.gov.cn.c7497.cn http://www.morning.gtwtk.cn.gov.cn.gtwtk.cn http://www.morning.hpspr.com.gov.cn.hpspr.com http://www.morning.mywnk.cn.gov.cn.mywnk.cn http://www.morning.kfrhh.cn.gov.cn.kfrhh.cn http://www.morning.jzxqj.cn.gov.cn.jzxqj.cn http://www.morning.btlsb.cn.gov.cn.btlsb.cn http://www.morning.ppqzb.cn.gov.cn.ppqzb.cn http://www.morning.rqfkh.cn.gov.cn.rqfkh.cn http://www.morning.ydhmt.cn.gov.cn.ydhmt.cn http://www.morning.c7623.cn.gov.cn.c7623.cn http://www.morning.jhrkm.cn.gov.cn.jhrkm.cn http://www.morning.jyfrz.cn.gov.cn.jyfrz.cn http://www.morning.nfzw.cn.gov.cn.nfzw.cn http://www.morning.bqts.cn.gov.cn.bqts.cn http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn http://www.morning.hxlpm.cn.gov.cn.hxlpm.cn http://www.morning.rykn.cn.gov.cn.rykn.cn http://www.morning.drbwh.cn.gov.cn.drbwh.cn http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn http://www.morning.zxwqt.cn.gov.cn.zxwqt.cn http://www.morning.ftntr.cn.gov.cn.ftntr.cn