java编写聊天室和爬虫实验报告
Java 语言与网络 课程设计
题目名称:用 JavaSocket 编程开发聊天室
用 JavaURL 编程爬取并分析网页敏感词 姓
名:
学
号:
专
业:
信息安全
班
级:
1602 班
指导教师:
张伟
编写日期:
2018 年 3 月 25 日星期日
目录
第一章 开发工具及环境说明…………………………………2 第二章 网络聊天程序业务分析………………………………3 第三章 网络聊天程序系统设计………………………………4 一、 系统功能定义…………………………………………4 二、 关键问题设计…………………………………………4 1.系统模块设计………………………………………4 2.系统类设计…………………………………………4 第四章 聊天程序源代码清单…………………………………11 第五章 聊天程序运行结果与测试分析………………………23 第六章 用 JavaURL 编程爬取并分析网页敏感词业务分析…29 第七章 用 JavaURL 编程爬取并分析网页敏感词系统设计…30 一、 系统功能定义…………………………………………30 二、 关键问题设计…………………………………………30 1.系统模块设计………………………………………30 2.系统类设计…………………………………………30 第八章 用 JavaURL 编程爬取并分析网页敏感词源代码清单…38 第九章 用 JavaURL 编程爬取并分析网页敏感词运行结果与测试分析……………………………………………………………58 第十章 结论与心得……………………………………………62
第一章 开发工具及环境说明 开发工具:Intellij IDEA
环境说明:Windows 10
第二章 网络聊天程序业务分析 一、实践目的或任务:
通过指导学生上机实践,对 JavaSocket 编程、Java 多线程、Java 图形用户界面进行掌握。
二、实践基本要求:
1.了解实验目的及实验原理; 2.编写程序,并附上程序代码和结果图; 3.总结在编程过程中遇到的问题、解决办法和收获。
三、实践的内容或要求:
1. 用 Java 图形用户界面编写聊天室服务器端和客户端, 支持多个客户端连接到一个服务器。每个客户端能够输入账号。
2. 可以实现群聊(聊天记录显示在所有客户端界面)。
3. 完成好友列表在各个客户端上显示。
4. 可以实现私人聊天,用户可以选择某个其他用户,单独发送信息。
5. 服务器能够群发系统消息,能够强行让某些用户下线。
6. 客户端的上线下线要求能够在其他客户端上面实时刷新。
第三章 网络聊天程序系统设计 一、系统功能定义 本系统要实现的功能如下:
1. 客户端
(1)登录 客户端系统运行,出现登录界面。该界面出现在屏幕中间。用户输入其用户名,然后建立与服务器的连接,输入成功后显示聊天界面。已经登陆了聊天室的用户的聊天记录上面实时刷新上线下线消息,并且同时更新客户端和服务器端的用户列表。
(2)群聊 客户端首先发送消息到服务器端,服务器端转发给全体客户端,所有客户端接收消息并显示在聊天记录中。将消息写入输入框,点击 “发送消息”即可在群内发言。聊天记录显示在所有客户端界面左边,好友列表在各个客户端右边显示。
(3)私聊 客户端首先发送消息到服务器端,服务器端转发给全体客户端,所有客户端接收消息,但是只有特定客户端处理此消息。A 点击右侧好友列表的 B,然后点击“私发消息”,即弹出私聊界面,将消息写入输入框,点击 “发消息”即可与另一方私聊。B 的聊天界面显示“系统提示:A 私聊了你”,然后点击右侧列表对应好友的用户名,并且点击“发消息”即可查看对方的聊天记录并与对方私聊。
2. 服务器端
(1)
群发系统消息 服务器将消息写入输入框,点击 “群发消息”即可将消息发送给全体客户端,在群内显示系统消息。
(2)
踢用户下线 点击用户列表中对应用户的用户名,然后点击“踢出聊天室”即可关闭对应客户端的套接字,让其在显示“您已被系统请出聊天室!”后关闭会话窗口,强制下线。
二、关键问题设计 1.
系统模块设计
1.1 聊天系统工作原理图
1.2
系统功能模块图:
1.3 活动图:
1)用户登陆活动图 首先填写登陆信息,提交以后登陆成功,更新在线状态。通知所有好友自己已经上线。服务器再检查是否有他的离线消息,如果有则立即发送给用户。
2)发送消息活动图 短消息发送以后,服务器端对应的监听线程会接收到一个字符串。其中包含特殊含义的字符,对应特定的聊天功能。
(1)客户端 上线:LOGIN#nickname 下线:OFFLINE#nickname#msg 群发消息:MSG#nickname#msg 私发消息:第一次:FSMSG#send nickname#receive nicknmame#msg 第一次之后:SMSG#send nickname#receive nicknmame#msg (2)服务器端 群发消息:ALL#msg
踢人:OFFLINE#nickname 好友列表:USERS#nickname
2.
系统类设计
2.1 sever 类的设计
1.ChatThread:和客户进行消息通信的类。
Socket 又称为套接字,是两个程序进行双向数据传输的网络通信的端点,一般由 IP + PORT 构成。通常采用的端口是大于 1023 的小于 65535 的数,1023之前一般被占用,如 80 被 HTTP 服务其占用,21 被 Telnet 占用,23 被 FTP 服务器占用等等。Socket 是一种底层的通信机制,通过 Socket 的数据是原始的字节流,必须经过两端的程序按照协议进行处理和解释。其分为两类,面向连接的TCP/IP 通信,和非连接的 UDP 数据报通信,此次实验聊天室是采用 TCP/IP 面向连接编写的。
在服务器端和客户端,分别使用 ServerSocket 和 Socket,基本流程如下:
(1)创建套接字 (2)打开连接的 IO (3)按照协议读写 (4)关闭资源
服务器用来听,用来等待客户端程序来寻找。如果客户端的程序来寻找 9999端口,那么这个程序就会响应。
服务器通过一个循环一直监听 9999 端口,当有客户端连接到端口时,并把连接的通信添加到服务器管理集合。
大致步骤:
(1)创建一个 socket 监听端口 9999。服务器从其连接套接字读取一行字符 (2)通过循环实现一直监听 9999 端口 (3)当有客户端连接到端口时,把连接的客户端传到新的线程将连接的通信添加到服务器管理集合 (4)用 t userList 定义一个集合,用来存放不同的客户端,可以往客户端里添加个体,并能实现删除 t userList 中断开连接的线程 (5)循环读取数据,当输入流的数据不为空时,把数据发送到每一个客户端 (6)没有数据后,关闭输入流 重写线程,将 br 作为“听筒”读取全部客户端发送的消息,ps 作为“话筒”向在线的全部客户端发送消息,实现客户端与服务器端的交互。
2.run:接受客户连接请求的类 通过循环监听 9999 端口,当有新用户连接时,把连接的客户端传到新的线程,将连接的通信添加到服务器管理集合,并在聊天室内发送新用户上线的消息。
3.
sendMessage:将消息转发给所有客户端
4.handleAll:群发系统消息
5.handleExpel:强行让某些用户下线并发布下线消息
2.2 client 类的设计
1. handleSend():实现群聊
2. handleSS():实现私聊
3. handleSec():私聊界面
4. run:接受服务器消息的类
5.好友列表在各个客户端上显示,客户端的上线下线要求能够在其他客户端上面实时刷新 DefaultListModel<String> dl = new DefaultListModel<String>(); private JList<String> userList = new JList<String>( dl); JScrollPane listPane = new JScrollPane( userList); listPane.setPreferredSize(dim2); west.add( listPane,BorderLayout. CENTER ); //上线:
String msg = br.readLine(); String[] strs = msg.split( "#"); //判断是否为服务器发来的登陆信息 if(strs[0].equals( "LOGIN")){
if(!strs[1].equals( nickName)){
jta.append(strs[1] + " " 上线啦!\ \ n");
dl.addElement(strs[1]);
userList.repaint();
} //下线:
else if(strs[0].equals( "OFFLINE")){
dl.removeElement(strs[1]);
userList.repaint(); }
第四章
聊天程序源代码清单 1.sever package chat;
import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList;
class server extends JFrame implements Runnable, ListSelectionListener, ActionListener {
private Socket s = null;
private ServerSocket ss = null;
private ArrayList<ChatThread> users = new ArrayList<ChatThread>();
DefaultListModel<String> dl = new DefaultListModel<String>();
private JList<String> userList = new JList<String>(dl);
private JPanel jpl = new JPanel();
private JButton jbt = new JButton("踢出聊天室");
private JButton jbt1 = new JButton("群发消息");
//群发消息输入栏
private JTextField jtf = new JTextField();
public server() throws Exception{
this.setTitle("服务器端");
this.add(userList, "North");//放在北面
this.add(jpl, "South");
//仅将群发消息输入栏设为一栏
jtf.setColumns(1);
jtf.setBackground(Color.pink);
jpl.setLayout(new BorderLayout());
jpl.add(jtf, BorderLayout.NORTH);
jpl.add(jbt,BorderLayout.EAST);//踢出聊天室
jpl.add(jbt1, BorderLayout.WEST);//群发消息
//实现群发
jbt1.addActionListener(this);
//实现踢人
jbt.addActionListener(this);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocation(400,100);
this.setSize(300, 400);
this.setVisible(true);
this.setAlwaysOnTop(true);
ss = new ServerSocket(9999);
new Thread(this).start();
}
@Override
public void run() {
while(true){
try{
s = ss.accept();
ChatThread ct = new ChatThread(s);
users.add(ct);
//发送 Jlist 里的用户登陆信息
ListModel<String> model = userList.getModel();
for(int i = 0; i < model.getSize(); i++){
ct.ps.println("USERS#" + model.getElementAt(i));
}
ct.start();
}catch (Exception ex){
ex.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(this,"服务器异常!");
System.exit(0);
}
}
}
//List 选择事件监听
@Override
public void valueChanged(ListSelectionEvent e) {
}
//群发消息按钮点击事件监听
@Override
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
if(label.equals("群发消息")){
handleAll();
}else if(label.equals("踢出聊天室")){
try {
handleExpel();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void handleAll(){
if(!jtf.getText().equals("")){
sendMessage("ALL#" + jtf.getText());
//发送完后,是输入框中内容为空
jtf.setText("");
}
}//群发消息
public void handleExpel() throws IOException {
users.get(userList.getAnchorSelectionIndex()).s.close();//关闭套接字
sendMessage("OFFLINE#" + userList.getSelectedValuesList().get(0));
dl.removeElement(userList.getSelectedValuesList().get(0));
userList.repaint();
}//踢人
public class ChatThread extends Thread{
Socket s = null;
private BufferedReader br = null;
private PrintStream ps = null;
public boolean canRun = true;
String nickName = null;
public ChatThread(Socket s) throws Exception{
this.s = s;
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
ps = new PrintStream(s.getOutputStream());
}
public void run(){
while(canRun){
try{
String msg = br.readLine();
String[] strs = msg.split("#");
if(strs[0].equals("LOGIN")){//收到来自客户端的上线消息
nickName = strs[1];
dl.addElement(nickName);
sendMessage(msg);
}else if(strs[0].equals("MSG") || strs[0].equals("SMSG") || strs[0].equals("FSMSG")){
sendMessage(msg);
}else if(strs[0].equals("OFFLINE")){//收到来自客户端的下线消息
sendMessage(msg);
//System.out.println(msg);
dl.removeElement(strs[1]);
// 更新 List 列表
userList.repaint();
}
}catch (Exception ex){}
}
}
}
public void sendMessage(String msg){//发送给所有用户
for(ChatThread ct : users){
ct.ps.println(msg);
}
}
public static void main(String[] args) throws Exception{
new server();
}
}
2.client package chat;
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket;
public class client extends JFrame implements Runnable,ActionListener {
//north
private JMenuBar bar = new JMenuBar();
private JMenu menu = new JMenu("关于");
private JMenuItem about = new JMenuItem("关于本软件");
private JMenuItem exit = new JMenuItem("退出");
JPanel north = new JPanel();
//west
JPanel west = new JPanel();
DefaultListModel<String> dl = new DefaultListModel<String>();
private JList<String> userList = new JList<String>(dl);
JScrollPane listPane = new JScrollPane(userList);
//center
JPanel center = new JPanel();
JTextArea jta = new JTextArea(10,20);
JScrollPane js = new JScrollPane(jta);
JPanel operPane = new JPanel();
JLabel input = new JLabel("请输入:");
JTextField jtf = new JTextField(24);
JButton jButton = new JButton("发消息");
private JButton jbt = new JButton("发送消息");
private JButton jbt1 = new JButton("私发消息");
private BufferedReader br = null;
private PrintStream ps = null;
private String nickName = null;
JTextArea jTextArea = new JTextArea();
JTextField jTextField = new JTextField();
String suser = new String();
boolean flag = false;
public cllient() throws Exception{
//north
bar.add(menu);
menu.add(about);
menu.add(exit);
about.addActionListener(this);
exit.addActionListener(this);
BorderLayout bl = new BorderLayout();
north.setLayout(bl);
north.add(bar,BorderLayout.NORTH);
add(north,BorderLayout.NORTH);
//west
Dimension dim = new Dimension(100,150);
west.setPreferredSize(dim);
Dimension dim2 = new Dimension(100,300);
listPane.setPreferredSize(dim2);
BorderLayout bl2 = new BorderLayout();
west.setLayout(bl2);
west.add(listPane,BorderLayout.CENTER);//显示好友列表哈哈
add(west,BorderLayout.EAST);
userList.setFont(new Font("隶书",Font.BOLD,18));
//center
jta.setEditable(false);
jtf.setBackground(Color.pink);
BorderLayout bl3 = new BorderLayout();
center.setLayout(bl3);
FlowLayout fl = new FlowLayout(FlowLayout.LEFT);
operPane.setLayout(fl);
operPane.add(input);
operPane.add(jtf);
operPane.add(jbt, BorderLayout.WEST);
operPane.add(jbt1, BorderLayout.EAST);
center.add(js,BorderLayout.CENTER);
center.add(operPane,BorderLayout.SOUTH);
add(center,BorderLayout.CENTER);
js.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
//鼠标事件,点击
jbt.addActionListener(this);
jbt1.addActionListener(this);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//this.setAlwaysOnTop(true);
nickName = JOptionPane.showInputDialog("用户名:");
this.setTitle(nickName + "的聊天室");
this.setSize(600,400);
this.setVisible(true);
Socket s = new Socket("127.0.0.1", 9999);
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
ps = new PrintStream(s.getOutputStream());
new Thread(this).start();
ps.println("LOGIN#" + nickName);
//键盘事件,实现当输完要发送的内容后,直接按回车键,实现发送
//监听键盘相应的控件必须是获得焦点(focus)的情况下才能起作用
jtf.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
ps.println("MSG#" + nickName + "#" +
jtf.getText());
//发送完后,是输入框中内容为空
jtf.setText("");
}
}
});
jtf.setFocusable(true);
//监听系统关闭事件,退出时给服务器端发出指定消息
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
ps.println("OFFLINE#" + nickName);
}
});
}
public void run(){
while (true){
try{
String msg = br.readLine();
String[] strs = msg.split("#");
//判断是否为服务器发来的登陆信息
if(strs[0].equals("LOGIN")){
if(!strs[1].equals(nickName)){
jta.append(strs[1] + "上线啦!\n");
dl.addElement(strs[1]);
userList.repaint();
}
}else if(strs[0].equals("MSG")){
if(!strs[1].equals(nickName)){
jta.append(strs[1] + "说:" + strs[2] + "\n");
}else{
jta.append("我说:" + strs[2] + "\n");
}
}else if(strs[0].equals("USERS")){
dl.addElement(strs[1]);
userList.repaint();
} else if(strs[0].equals("ALL")){
jta.append("系统消息:" + strs[1] + "\n");
}else if(strs[0].equals("OFFLINE")){
jta.append(strs[1] + "下线啦!\n");
dl.removeElement(strs[1]);
userList.repaint();
}else if((strs[2].equals(nickName) || strs[1].equals(nickName)) && strs[0].equals("SMSG")){
if(!strs[1].equals(nickName)){
jTextArea.append(strs[1] + "说:" + strs[3] + "\n");
}else{
jTextArea.append("我说:" + strs[3] + "\n");
}
}else if((strs[2].equals(nickName) || strs[1].equals(nickName))&& strs[0].equals("FSMSG")){//只有发信人和私信人能看(第一次)
if(strs[2].equals(nickName)){//如果被私信人是自己则显示系统消息
jTextArea.append(strs[1] + "说:" + strs[3] + "\n");
jta.append("系统提示:" + strs[1] + "私信了你" + "\n");
}else{//若自己为发信人
jTextArea.append( "我说:" + strs[3] + "\n");
}
}
}catch (Exception ex){
ex.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(this, "您已被系统请出聊天室!");
ps.println("OFFLINE#" + nickName);
System.exit(0);
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
if(label.equals("发送消息")){//群发
handleSend();
}else if(label.equals("私发消息") && !userList.isSelectionEmpty()){//未点击用户不执行
suser = userList.getSelectedValuesList().get(0);
handleSec();
}else if(label.equals("发消息")){
handleSS();
}else if(label.equals("关于本软件")){
JOptionPane.showMessageDialog(this, "世界上最可爱的人制作");
}else if(label.equals("退出")){
JOptionPane.showMessageDialog(this, "您已成功退出!");
ps.println("OFFLINE#" + nickName);
System.exit(0);
} else{
System.out.println("不识别的事件");
}
}
public void handleSS(){
if(flag){
ps.println("SMSG#" + nickName + "#" + suser + "#" + jTextField.getText());
jTextField.setText("");
}else{//首次私信格式为"FSMSG#
发信人
# 收信人 # 内容
ps.println("FSMSG#" + nickName + "#" + suser + "#" + jTextField.getText());
jTextField.setText("");
flag = true;
}
}//私聊中
public void handleSend(){
//发送信息时标识一下来源
ps.println("MSG#" + nickName + "#" +
jtf.getText());
//发送完后,是输入框中内容为空
jtf.setText("");
}//群聊
public void handleSec(){
JFrame jFrame = new JFrame();
jFrame.add(jButton, BorderLayout.SOUTH);
jFrame.add(jTextField, BorderLayout.NORTH);
jFrame.add(jTextArea,BorderLayout.CENTER);
jButton.addActionListener(this);
jTextArea.setFont(new Font("宋体", Font.PLAIN,15));
jTextField.setBackground(Color.pink);
jFrame.setSize(400,300);
jFrame.setLocation(400,150);
jFrame.setTitle("与" + userList.getSelectedValuesList().get(0) + "私聊中");
jFrame.setVisible(true);
jFrame.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
public void windowClosing(WindowEvent e) {
flag = false;
//JOptionPane.showMessageDialog(this, "您已成功退出!");
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
});
}//私聊窗口
public static void main(String[] args)throws Exception{
new client();
} }
第五章
聊天程序运行结果与测试分析 1. 服务器界面 首先运行服务器界面,界面如图。
服务器运行后,客户可以登录聊天室。服务器显示在线用户列表,客户注册时,能够将用户名存在服务器端。服务器将消息写入输入框,点击 “群发消息”即可将消息发送给全体客户端,在群内显示系统消息。点击用户列表中对应用户的用户名,然后点击“踢出聊天室”即可关闭对应客户端的套接字,让其在显示“您已被系统请出聊天室!”后关闭会话窗口,强制下线。
2. 登录界面 客户端系统运行,出现登录界面,如图。
该界面出现在屏幕中间,在这个界面中:
输入用户名,并点击“确定”按钮,能够连接到服务器,能够到达聊天界面。
3.聊天界面 客户登录成功之后,出现聊天界面,如图。
在这个界面中:
a) 标题栏显示当前登陆的账号。
b) 左边显示聊天记录,右边显示在线用户名单。
c) 客户可以进行群聊,也可以选择一个在线账号,与其进行私聊。
(1)实现群聊
(2)刷新好友列表
(3)私聊
(4)服务器群发消息
(5)实现踢人
第六章 用 JavaURL 编程爬取并分析网页敏感词业务分析 一、实践目的或任务:
通过指导学生上机实践,对 JavaURL 编程、Java 图形界面进行掌握。
二、实践基本要求:
1.了解实验目的及实验原理; 2.编写程序,并附上程序代码和结果图; 3.总结在编程过程中遇到的问题、解决办法和收获。
三、实践的内容或要求:
1.编写界面,输入一个网址,能够爬取该网址上所有的 HTML 源代码。
2.对网址中的文本进行提取。
3.建立敏感词库,用文本文件保存。
4.将该网址所对应的文本中的敏感词提取并高亮显示。
5.编写文本文件,可以存入多个网址;程序可爬取这些网址中的文本内容,将敏感词记录存入另一个文件,格式自定。
6.编写一个主界面,整合上述功能。
第七章 用 JavaURL 编程爬取并分析网页敏感词系统设计 一、系统功能定义 本系统要实现的功能如下:
1. 主界面
(1)网页分析功能 运行 GUI,在输入框输入一个网址,选择“爬取网页”能够爬取该网址上所有的 HTML 源代码并在控制台输出,
(2)保存文本功能 将爬取的文本和敏感词记录保存在爬取文本.txt 中,同时将敏感词记录存入敏感词记录.txt。
(3)显示文本功能 弹出的显示文档页面可以将该网址所对应的文本中的敏感词高亮显示。
(4)保存网址功能 选择“保存网址”能够将所输入网址保存在文本文件 weblist.txt 中,此文件可以存入多个网址。
2. 批量爬取界面
(1)批量爬取功能 运行 WebGroup,点击 “批量爬取”能通过循环运行 webPageResource 爬取weblist.txt 中网址中的内容。
(2)保存文本功能 将 Weblist.txt 中网址中的文本内容并存入批量爬取.txt 中,同时将敏感词记录存入敏感词记录.txt。
(3)显示文本功能 弹出的显示文档页面可以将该网址所对应的文本中的内容显示。
二、 关键问题设计 1. 系统模块设计
1.1 网络爬虫工作原理图 (1)爬取网页 http 源代码及文本 通常在写爬虫程序时,httpClient 结合 Jsoup 共同使用即可实现完美的爬虫系统。
httpClient 负责模拟浏览器发送请求,Jsoup 负责解析 httpClient 请求返回的 HTML 页面,解析获取需要的数据。HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。
获取此链接的 document 对象,并使用 toString 方法输出:
(2)爬取网页文本 jsoup elements 对象支持类似于 CSS (或 jquery)的选择器语法,来实现非常强大和灵活的查找功能。.
这个 select 方法在 Document, Element,或 Elements 对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。Select方法将返回一个 Elements 集合,并提供一组方法来抽取和处理结果。
String text = document.select( "p").text(); // 取得文本
(3)敏感词匹配 在实现文字过滤的算法中,DFA 是唯一比较好的实现算法。DFA 即Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过 event和当前的 state 得到下一个 state,即 event+state=nextstate。
以 Java 中的 HashMap 来实现 DFA 算法。具体过程如下(日本人,日本鬼子为例):
1、在 hashMap 中查询“日”看其是否在 hashMap 中存在,如果不存在,则证明已“日”开头的敏感词还不存在,则我们直接构建这样的一棵树。跳至 3。
2、如果在 hashMap 中查找到了,表明存在以“日”开头的敏感词,设置hashMap = hashMap.get("日"),跳至 1,依次匹配“本”、“人”。
3、判断该字是否为该词中的最后一个字。若是表示敏感词结束,设置标志位 isEnd = 1,否则设置标志位 isEnd = 0;
(4)敏感词高亮 敏感词高亮部分我选择使用 java 中的 public class DefaultHighlighter中的函数 addHighlight (int
p0, int
p1, Highlighter.HighlightPainter p) 可以实现在视图中添加一个高亮。
1.2
活动图:
2. 系统类设计
2.1 GUI 类的设计
(使用 GUI form)
1.
writeFile:将网址保存在 weblist.txt 中
2.GUI:爬取网页,并保存爬取文本在爬取文本.txt 中,打开“打开文件”界面。
2.2 WebGroup 类的设计
1. readInStrings:读取 weblist.txt 中的网址
2. actionPerformed:批量爬取
2.3 webPageResource 类的设计
1.
getPageSource:爬取网页 http 源代码
2.
writeFile:保存文本文件
3. getItemContent:获取文本和敏感词并调用 writeFile 保存文本文件
2.4 SensitiveWordInit 类的设计
1. SensitiveWordInit:初始化敏感词库,将敏感词加入到 HashMap 中,构建DFA 算法模型
2.initKeyWord():初始化敏感词库
3.
readSensitiveWordFile:读取敏感词库中的内容,将内容添加到 set 集合中
4. addSensitiveWordToHashMap:将敏感词加入到 HashMap 中,构建 DFA 算法模型
2.5 SensitivewordFilter 类的设计
1. SensitivewordFilter():构造函数,初始化敏感词库
2. getSensitiveWord:获取文字中的敏感词
3. CheckSensitiveWord:查文字中是否包含敏感字符,如果存在,则返回敏感词字符的长度,不存在返回 0
2.6 ShowFileContent 类的设计
1. MyFrame:显示文件内容
2.
MyFileFilter:选择显示文件的类型
3.敏感词高亮 private JTextArea txtInfo = new JTextArea(50, 50);
switch ( fileDlg.showOpenDialog( this)) {
case JFileChooser. APPROVE_OPTION :
txtInfo.setText( null );
String filePath = fileDlg.getSelectedFile().getAbsolutePath();
setTitle( fileDlg.getSelectedFile().getName() );
showFileContent( filePath );
Highlighter highLighter = txtInfo.getHighlighter();
String text = txtInfo.getText();
File file= new File( "D:\ \\ \ Web Spider\ \\ \ 敏感词记录 .txt");
FileReader fr= null;
try {
fr = new FileReader(file);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
BufferedReader br= new BufferedReader(fr);
DefaultHighlighter.DefaultHighlightPainter p = new DefaultHighlighter.DefaultHighlightPainter(Color. RED );
String keyWord=" "";
try {
while((keyWord=br.readLine())!= null){
int pos = 0;
while ((pos = text.indexOf(keyWord, pos)) >= 0)
{
try
{
highLighter.addHighlight(pos, pos + keyWord.length(), p);
pos += keyWord.length();
}
catch (BadLocationException ex)
{
ex.printStackTrace();
}
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
try {
fr.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
br.close();
} catch (IOException e1) {
e1.printStackTrace();
} }
第八章 用 JavaURL 编程爬取并分析网页敏感词源代码清单 1.GUI package spider;
import org.jsoup.nodes.Document;
import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*;
public class GUI {
public String url;
public SensitivewordFilter filter = new SensitivewordFilter();
//public webPageResource wpr=new webPageResource();
public GUI() {
SpiderButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e){
String s1=jft.getText();
//writeOutStrings1("webtouse",s1);
//webPageResource wpr=new webPageResource();
webPageResource wpr=new webPageResource();
//Set<String> set=filter.getSensitiveWord(string,1);
//public webPageResource wpr=new webPageResource();
Document document=wpr.getPageSource(s1);
String title = document.title();
String text = document.select("p").text(); // 取得字符串中的文本
String htmls= wpr.getPageSource(s1).toString();
System.out.println(htmls);
// wpr.saveArticle(title,text);
wpr.writeFile("D:\\Web Spider\\爬取文本.txt",title+"\n"+text+"\n");
//wpr.writeFile("D:\\Web Spider\\爬取文本.txt",wpr.ItContent);
wpr.getItemContent(s1);
ShowFileContent sfc=new ShowFileContent();
MyFrame myfram=new MyFrame("打开文件");
// System.out.println("语句中包含敏感词的个数为:" + set );
}
});
SaveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String s2=jft.getText();
writeFile("D:\\Web Spider\\weblist.txt",s2+"\n");
}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame("GUI");
frame.setContentPane(new GUI().panel1);
frame.setLocation(400,300);
frame.setSize(350, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.pack();
frame.setVisible(true);
}
private JPanel panel1;
private JButton SaveButton;
private JButton SpiderButton;
private JTextField jft;
public void writeFile(String filename, String str){
try{
FileOutputStream fos = new FileOutputStream(filename, true);
byte[] b = str.getBytes();
fos.write(b);
fos.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException ioe){
ioe.printStackTrace();
}
}
}
2. WebGroup package spider;
import org.jsoup.nodes.Document;
import javax.swing.*; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.event.*; import java.io.*;
public class WebGroup extends JFrame implements ActionListener{
private static JTextArea txtInfo = new JTextArea(50, 50);
private JButton btnOpen = new JButton("
批量爬取
");
private JScrollPane sp = new JScrollPane(txtInfo);
private JPanel btnPane = new JPanel();
//static int lines;
//static String line = " ";
public WebGroup(){
super("网址列表");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btnPane.add(btnOpen);
btnOpen.setActionCommand("spider");
btnOpen.addActionListener(this);
txtInfo.setFont(new Font("宋体", Font.PLAIN, 16));
txtInfo.setBackground(Color.WHITE);
txtInfo.setForeground(Color.black);
Container cp = getContentPane();
cp.add(btnPane, BorderLayout.SOUTH);
cp.add(sp, BorderLayout.CENTER);
this.setPreferredSize(new Dimension(500, 400));
this.setLocation(400, 200);
this.setVisible(true);
this.pack();
String path = "D:\\Web spider\\weblist.txt";
File file = new File(path);
readInStrings(file);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "spider") {
String path = "D:\\Web spider\\weblist.txt";
File file = new File(path);
readInStrings(file);
Reader reader = null;
try {
reader = new FileReader(file);
BufferedReader buf = new BufferedReader(reader);
int lines = 0;
String line = " ";
while ((line = buf.readLine()) != null) {
String s = line;
webPageResource wpr = new webPageResource();
...
- 范文大全
- 职场知识
- 精美散文
- 名著
- 讲坛
- 诗歌
- 礼仪知识
-
超星尔雅学习通《对话大国工匠致敬劳动模范》题库附答案
超星尔雅学习通《对话大国工匠致敬劳动模范》题库附答案 1、历史只会眷顾坚定者、奋进者、搏击者,而不会
【入党申请书】 日期:2021-05-12
-
对于政治生态考核整改工作方案
本文系作者原创投稿,仅供学习参考,请勿照搬照抄! 关于政治生态考核整改工作的方案 为做好推进风清气正
【经济工作】 日期:2020-06-05
-
大学生学习2024年两会精神心得感悟
大学生学习2024年两会精神心得感悟过去一年,是全面贯彻二十大精神的开局之年,中国共产党带领全国各族人民,付出艰辛努力,换来重大成
【心得体会】 日期:2024-03-07
-
中国传统故事英文版 中国古代故事英文版
历史学科蕴含着许多丰富的、生动的、有趣的素材,每一个历史事件、历史人物都有相关的、动人的历史小故事,都能给人以启迪。你对中国古代的故事了解多少呢?下面是小编为您...
【调查报告】 日期:2019-05-22
-
基尔霍夫定律验证实验报告
基尔霍夫定律的验证的实验报告本文关键词:基尔,定律,霍夫,验证,实验基尔霍夫定律的验证的实验报告本文
【思想宣传】 日期:2021-03-08
-
中小学党建工作实施意见
中小学党建设工作实施意见中小学校担负着培养德智体美全面发展的社会主义建设者和接班人的重要使命。加强中
【爱国演讲】 日期:2020-09-22
-
地藏经诵读仪规(完整版)
地藏经诵读仪规(完整版) 恭请文: 恭请大慈大悲大愿地藏王菩萨、护法诸天菩萨慈悲加持护念弟子***能
【个人简历】 日期:2021-03-31
-
青年学生学习全国人大十四届二次会议心得感想16篇
青年学生学习全国人大十四届二次会议心得感想16篇报告中提到政府在经济调控、消费政策、基础设施和制造业投资、房地产调控以及地方债务
【心得体会】 日期:2024-03-07
-
小学党建工作制度
小学党建工作制度33篇 党建工作责任制度 1 党支部年初制定全年党建工作计划,将目标任务分解到有关部
【思想学习】 日期:2021-02-10
-
材料力学考题
材料力学考题本文关键词:材料力学,考题材料力学考题本文简介:材料力学1、简易起重设备中,AC杆由两根
【入党申请书】 日期:2021-03-06
-
执行信息公开网
执行信息公开网 执行信息公开网 执行信息公开网: zhi*ing (点击下图可直接进行访问) 全国
【职场知识】 日期:2020-07-03
-
年国家开放大学电大电子商务单选题题库
单选: 1、EDI是指A、电子商务B、电子数据交换C、电子交易 D、移动数据交换 答案: B 2、电
【职场知识】 日期:2020-06-05
-
大学教师毕业设计指导记录4篇
大学教师毕业设计指导记录4篇 毕业设计是指工、农、林科高等学校和中等专业学校学生毕业前夕总结性的独立作业。是实践性教学最后一
【职场知识】 日期:2022-05-11
-
“以学生为中心”的教学原则
以学生为中心的教学原则教师在开展以学生为中心的教学实践中,必须谨记学习目标不再是知识的获得,能力要比知识更重要。以下是蒲公英阅读网
【职场知识】 日期:2023-01-05
-
有机磷酸酯类中毒及其解救(实验报告范文)
有机磷酸酯类中毒及其解救XXX、XXX一、实验目的1 观察有机磷酸酯类农药敌百虫中毒时的症状。 2
【职场知识】 日期:2020-08-30
-
组工干部学习谈治国理政第三卷《共建创新包容开放型世界经济》心得体会
组工干部学习谈治国理政第三卷《共建创新包容的开放型世界经济》心得体会 《习近平谈治国理政》第三卷第七
【职场知识】 日期:2020-09-22
-
2021教育基础知识试题(附答案)
2021教育基础知识精选试题(附答案) 1、主张恢复西方传统教育核心价值,反对“进步教育
【职场知识】 日期:2021-03-17
-
男一分钟仰卧起坐标准表
表表11--13 男生一分钟仰卧起坐、引体向上单项评分表(单位:次) 等级 单项 得分 三年级 四年
【职场知识】 日期:2021-05-08
-
心理健康黑板报_心理健康黑板报图片
虽然工作上难免压力,但是只要正视压力,一切就不会太辛苦。下面就随小编看看心理健康黑板报内容,希望喜欢哦。 心理健康黑板报图片欣赏 心理健康黑板报图片1 心理健...
【职场知识】 日期:2020-02-26
-
“从青风公司审计案例看销售与收款循环审计”案例说明书
“从青风公司审计案例看销售与收款循环审计”案例说明书一、本案例要解决的关键问
【职场知识】 日期:2020-09-28
-
唐代诗人李昂个人信息
唐代诗人李昂个人信息 导读:我根据大家的需要整理了一份关于《唐代诗人李昂个人信息》的内容,具体内容:
【古典文学】 日期:2020-11-07
-
[关于中秋的朗诵诗词] 关于爱国的朗诵诗词
中秋,热闹的街头树起了灯彩,舞起了火龙。你知道多少关于中秋的朗诵诗词?下面小编为你整理了几篇关于中秋的朗诵诗词,希望对你有帮助。 关于中秋的朗诵诗词一 中秋佳节...
【古典文学】 日期:2019-06-06
-
叠加原理实验报告
一、实验目的1、通过实验来验证线性电路中的叠加原理以及其适用范围。 2、学习直流仪器仪表的测试方法。
【古典文学】 日期:2020-11-12
-
输血查对制度
输血查对制度依据卫生部《临床输血技术规范》的要求,制订抽血交叉配备查对制度、取血查对制度、输血查对制
【古典文学】 日期:2020-09-24
-
大气唯美黑板报【国庆节大气黑板报】
日本在投降的那一天,再也没有昔日的嚣张,我们中国的屈辱得到洗刷。下面就随小编看看国庆节大气黑板报内容,希望喜欢哦。 国庆节大气黑板报图片欣赏 国庆节大气黑板报...
【古典文学】 日期:2019-05-05
-
【二人旅游英语情景对话】 二人英语对话2分钟旅游
随着国内外旅游业市场的不断扩大,旅游英语人才成为社会的紧缺人才。小编精心收集了二人旅游英语情景对话,供大家欣赏学习! 二人旅游英语情景对话1 A:Itsmyfirsttimeto...
【古典文学】 日期:2020-02-29
-
怎样认识世界处于百年未有之大变局
怎样认识世界处于百年未有之大变局 首先,“大变局”是对国际格局发生巨大变迁的
【古典文学】 日期:2020-10-28
-
2021公安专业知识考试练习题(附答案)
2021公安专业知识考试练习题(附答案) 1 甲地公安机关接到群众举报,在当天举行的大型娱乐活动中,
【古典文学】 日期:2021-01-29
-
法律知识手抄报图片大全|法律知识手抄报
我国开展了全面的普法宣传工作,法制宣传教育、普及法律常识作为经常的重要任务。做法制教育手抄报,普及法律知识。下面是小编为大家带来的法律知识手抄报图片大全,希望大家...
【古典文学】 日期:2020-03-10
-
乳糖检测方法
附录A(规范性附录) 乳糖的测定A 1原理牛乳或乳粉样液经沉淀剂澄清后,样液中的乳糖在苯酚、氢氧化钠
【古典文学】 日期:2020-12-08
-
时尚女装店面装修效果图|韩式女装店面装修
在服装店的设计之中,我们要将多变、创新、品牌自身的定位与发展趋势相结合,用一种可持续的设计方式呈现出来,以便更加适应不断更新的展示主体。下面小编就为大家解开时尚女装店...
【中国文学】 日期:2019-05-16
-
2021年超星尔雅学习通《辩论与修养》章节测试试题(共183题附答案)
2021年超星尔雅学习通《辩论与修养》章节测试试题(共183题附答案)1、辩论的目的不是单纯获得某种
【中国文学】 日期:2021-05-12
-
天地人格最佳搭配起名技巧|天地人格的五行怎么算
天地有阴有阳,物体刚柔表里,而数字则有一个诱导力,那么你知道怎么计算天地人格来取名吗?今天小编为你整理了天地人格最佳搭配起名技巧,一起来看看用天地人格取名的方法有哪些...
【中国文学】 日期:2019-06-06
-
信息技术重要性
信息技术的重要性 信息技术与课程整合将带来课程内容的革新,信息技术的高速发展,要求传统的课程必须适应
【中国文学】 日期:2021-02-11
-
【世界上最大的半岛】阿拉伯半岛
你知道世界上最大的半岛是什么吗?下面由小编来介绍一下。 阿拉伯半岛的简介 阿拉伯半岛(阿拉伯文:)位于亚洲,是世界上最大的半岛。沙特阿拉伯、也门、阿曼、阿拉伯联合...
【中国文学】 日期:2019-05-24
-
2022年当前世界下中国面临国际形势论文范本
和平与发展仍然是当今时代的主题。谋和平、求合作、促发展是各国人民的共同愿望。为了大家学习方便,下面是小编为大家整理的当前世界下中国面临的国际形势论文范文内容,以供参...
【中国文学】 日期:2022-03-31
-
古代人物漫画女生唯美图片欣赏 漫画人物图片女孩唯美
中国漫画始于清末民初,而平面设计虽然其名称是在改革开放以后确立的,但设计活动却自古就有,二者的相互影响是本文的主要讨论范围。小编整理了唯美古代女生人物漫画,欢迎阅读!...
【中国文学】 日期:2020-03-19
-
雪天安全行车注意事项_雪天安全行车提示语
维护城市交通秩序,争做河源文明市民。你们想看看雪天安全行车提示语有哪些吗?以下是小编推荐雪天安全行车提示语给大家,欢迎大家阅读! 安全行车温馨提示语【经典篇】 1...
【中国文学】 日期:2020-03-15
-
2021年5月时事政治热点(国内+国际)
2021年年5月时事政治热点(国内+国际)国内部分 1 55月月66日,由商务部和海南省人民政府共同
【中国文学】 日期:2021-06-10
-
普通高中通用技术学生设计作品图文材料
普通高中通用技术学生设计作品图文材料 一、基本情况作品名称:竹刻大佛笔筒设计人员:xxx学校班级:海
【中国文学】 日期:2020-09-28
-
改革开放大事记简表(改革开放新时期1978-2012年)
改革开放大事记简表 (1978-2012年) 时间1978年12月18日至22日地点北京事件党的十一
【外国名著】 日期:2021-06-17
-
山东省生产经营单位安全生产主体责任规定(303号令)
山东省生产经营单位安全生产主体责任规定(2013年2月2日山东省人民政府令第260号公布根据2016
【外国名著】 日期:2020-10-22
-
大学生音乐欣赏论文 大学音乐鉴赏论文3000
今天小编就为你介绍关于大学生音乐欣赏论文,下面是!小编给你搜集了相关资料!希望可以能帮助到大家。 大学生音乐欣赏论文—第一篇 音乐是生活不可缺少的一部分,学会欣...
【外国名著】 日期:2019-05-27
-
材料力学金属扭转实验报告
材料力学金属扭转实验报告 【实验目的】 1、验证扭转变形公式,测定低碳钢的切变模量G。;测定低碳钢和
【外国名著】 日期:2020-11-27
-
长豆角家常做法怎么做好吃营养 炒豆角的家常做法
豆角在我们日常生活中是很常见的食材,可能我们只知道它含有优质蛋白和维生素,其实它还有其他的营养价值。它也是可以和很多食材做搭配的。下面小编为大家整理了长豆角的做法...
【外国名著】 日期:2020-02-26
-
白烛葵的花语:白烛葵的不死幻想症
白烛葵,花名,花语为“不感兴趣”。现又指《知音漫客》上连载漫画《极度分裂》里主要角色之一。下面小编为你整理了白烛葵的花语。欢迎阅读。 白烛葵的花语:不感兴趣 ...
【外国名著】 日期:2019-05-11
-
(新版)就业知识竞赛题库及答案解析
(新版)就业知识竞赛题库(全真题库) 一、单选题1 (单选):在职业生涯规划工具中,组织在展开员工职
【外国名著】 日期:2021-07-21
-
植物装饰画黑白图片欣赏|荷花装饰画黑白图片
装饰画是一种装饰性艺术,是装饰性和创造性相结合的艺术设计形式。小编整理了植物装饰画黑白,欢迎阅读! 植物装饰画黑白图片展示 植物装饰画黑白图片1 植物装饰画黑白...
【外国名著】 日期:2019-05-31
-
坚定不移全面从严管党治警研讨发言稿
坚定不移全面从严管党治警研讨发言稿政治建警、从严治警是党在新时代的建警治警方针。一年前的全国公安工作
【外国名著】 日期:2020-09-18
-
把脉人力资源管理的风向标 什么是风向标
把脉人力资源管理的风向标 外部经营环境的巨大变化,不可避免地给身处其中的企业及其经营管理带来新的、深刻的变化和挑战:市场需求在明显萎缩;而买方市场中,客户要求
【外国名著】 日期:2019-09-04
-
梧桐花的花语|梧桐花的功效与作用
梧桐花为梧桐科植物梧桐的花,植物形态详梧桐子条。今天小编为你整理了梧桐花的花语,欢迎阅读。 梧桐花的花语是:情窦初开 在春季里晚开的花朵,有着恬淡的气息。 ...
【寓言童话】 日期:2020-03-03
-
西部计划笔试题库(99题含答案)
西部计划笔试题库(99题含答案) 1 第十三届全国人大三次会议表决通过了《中华人民共和国民法典》,自
【寓言童话】 日期:2021-06-16
-
大学生音乐欣赏论文 大学音乐鉴赏论文3000
今天小编就为你介绍关于大学生音乐欣赏论文,下面是!小编给你搜集了相关资料!希望可以能帮助到大家。 大学生音乐欣赏论文—第一篇 音乐是生活不可缺少的一部分,学会欣...
【寓言童话】 日期:2020-03-12
-
年学生资助诚信教育主题活动方案
各二级学院(部): 为深入贯彻落实习近平总书记关于教育的重要论述,落实立德树人根本任务,增强当代大学
【寓言童话】 日期:2020-06-21
-
主题教育调查研究工作方案2篇
主题教育调查研究工作方案1根据省、市、县开展“不忘初心、牢记使命”主题教育工
【寓言童话】 日期:2021-03-19
-
油管、套管规格尺寸对照表
API油管规格及尺寸 公称尺寸(in) 不加厚外径(mm) 不加厚内径(mm) 加厚外径(mm) 加
【寓言童话】 日期:2020-08-31
-
惊悚鬼故事50字 令人惊悚的故事
这些惊悚故事在短短的篇幅和时间之内让您感受到故事里传达出来的恐怖感,令你感到害怕。下面就是小编给大家整理的令人惊悚的故事,希望对你有用! 令人惊悚的故事篇1:学校...
【寓言童话】 日期:2019-05-13
-
读《李光耀观天下》有感_李光耀观天下txt在线读
务实与真诚 ——读《李光耀观天下》有感 原创:雁过留声ly 购于北大,在出差的飞机和高铁上读完,这本《李光耀观天下》给予我很多启示。严格地说,这本书没有详
【寓言童话】 日期:2019-05-05
-
【古代男生漫画图片大全】男生漫画头像
漫画和动画组成了动漫产业的两大支柱。然而,与动画相比,漫画在业界和学界皆相对冷清。小编整理了古代男生漫画,欢迎阅读! 古代男生漫画图片展示 古代男生漫画图片1 ...
【寓言童话】 日期:2019-05-27
-
北京最好吃的自助餐厅 北京高档自助餐排名
自助餐简直就是拯救大胃王的最佳饮食!没有之一!世界上没有什么事情是吃一顿自助餐解决不了的,如果有,那就吃两顿!下面小编给大家推荐北京几家好吃的自助餐。 北京最好吃的...
【寓言童话】 日期:2020-02-25
-
学生高考动员演讲稿
学生高考动员演讲稿3篇高考动员演讲稿11 老师们、同学们: 大家下午好!漫漫高考长征路已经进入尾声了
【百家讲坛】 日期:2021-09-22
-
企业安全演讲稿2021
最新企业安全的演讲稿5篇 演讲稿是作为在特定的情境中供口语表达使用的文稿。在充满活力,日益开放的今天
【百家讲坛】 日期:2021-09-22
-
XX镇扶贫项目实施专项整治工作总结_1
XX镇扶贫项目实施专项整治工作总结 为深入贯彻精准扶贫精准脱贫基本方略,认真落实党中央、国务院,省委
【百家讲坛】 日期:2021-09-22
-
对乡镇领导班子干部成员批评意见例文
对乡镇领导班子干部成员的批评看法范文 一、对党委书记XXX同志的批评看法〔3条〕 1、与干部交流偏少
【百家讲坛】 日期:2021-09-22
-
群英乡扶贫资金项目芬坡村祖埇村生产道路硬化工程绩效自评报告
群英乡扶贫资金项目((芬坡村祖埇村生产道路硬化工程))绩效自评报告 一、基本情况(一)群英乡扶贫资金
【百家讲坛】 日期:2021-09-22
-
党委书记警示教育大会上讲话2021汇编
党委书记在警示教育大会上的讲话55篇汇编 党委书记在警示教育大会上的讲话(一) 同志们: 根据省州委
【百家讲坛】 日期:2021-09-22
-
对于2021年召开巡视整改专题民主生活会对照检查材料
关于12021年召开巡视整改专题民主生活会对照检查材料 按照中央巡视组要求和省、市、区委统一部署,区
【百家讲坛】 日期:2021-08-14
-
消防安全知识培训试题.doc
消防安全知识培训试题姓名: 部门班组: 成绩: 一:填空题,每空4分,共44分。 1、灭火剂是通过隔
【百家讲坛】 日期:2021-08-14
-
涉疫重点人员“五包一”居家隔离医学观察工作流程
涉疫重点人员“五包一”居家隔离医学观察工作流程 目前,全球疫情仍处于大流行状
【百家讲坛】 日期:2021-08-14
-
疫情防控致全体师生员工及家长一封信
疫情防控致全体师生员工及家长的一封信 各位师生员工及全体家长朋友: 暑假已至,近期我省部分地方发现确
【百家讲坛】 日期:2021-08-14