SpringMVC实现垂直搜索引擎

时间:2022-09-08 12:42:29

本篇博客是在上一篇《Lucene搜索引擎+HDFS+MR完成垂直搜索》的基础上,在数据收集之后的JSP/Servlet方面,换为SpringMVC框架来实现。

借助SpringMVC技术完成数据库、HDFS、页面的交互,以达到实现垂直搜索引擎。

本篇博客的思想:一是深入数据收集、分析、关键词搜索呈现的流程实现;

        一是借此实践学习SpringMVC框架的技术。

首先简单阐述实现垂直搜索引擎的流程:1‘网络爬虫的数据存取到HDFS和数据库中;

                   2’MR对数据进行分析规约;

                  3‘SpringMVC实现关键词搜索并呈现到网页(此处为本篇重点阐述)

----->

目录:

1、SpringMVC阐述

2、创建web项目(添加Spring框架支持)

3、配置applicationContext.xml★★

4、配置web.xml文件★★

5、添加log4j.properties文件至src根目录

6、实现DAO操作类 

7、修改页面源码

8、编写控制器来自动接收参数,以及进行数据操作★★

9、过滤器解决乱码问题

10、结果显示

11、总结

------>

1、  SpringMVC阐述

SpringMVC是Spring的一个子框架,主要是用来处理MVC设计模式中的View和Control。

MVC:

Model:模型层,也就是数据库操作层。DAO部分代码

View:展示层,也就是页面显示部分。Servlet部分

Controller:控制层,也就是业务逻辑层。JSP部分

使用SpringMVC以后,这三部分代码都会有改变,由Spring来进行调整。

企业用的最多的是SpringMVC + MyBatis。

这里我们就只使用SpringMVC + JDBC来完成

Spring 在这三层可以有不同的作用:

Model层中Spring可以帮助进行数据源连接池的配置,还可以简化JDBC的操作代码,同时还能帮助完成自动的打开和关闭数据库连接。

View层中,Spring可以帮助我们简化表单提交的参数代码,也可以自动接收Control中返回的数据信息。

Control层中,Spring可以帮助我们自动接收页面提交的参数。

Spring的核心在于配置文件,所有的类的信息基本都要加入到配置文件中或使用Annotation来进行标注。

2、创建web项目(添加Spring框架支持)

SpringMVC实现垂直搜索引擎【项目整体呈现】

创建一个新的web项目,导入上一篇项目所需的jar包,以及拷贝vo类(DAO接口类)和utils类(关键词查询类)所在的包

先为项目加入Spring的框架支持

在项目上点右键,选择MyEclipse,然后找到install Spring … 的选项。

按照固定的步骤加入支持,最后一步时,一定要注意选择好需要的支持库,这里必须用到的是Persistence和Web

SpringMVC实现垂直搜索引擎

3、配置applicationContext.xml

这个文件Spring的配置文件,主要是将各种POJO,JAVA,action配置到XML转交给beanfactory管理,降低耦合度。

主要的配置组件:
<bean id="射影class的名字" class="写的JAVA类"/>

然后就是这些<bean>之间的依赖关系,比如:
<bean id="mySerive" class="org.haha.MyServiceImpl"/>
<bean id="loginAction" class="org.haha.LoginAction" scope="prototype">
<!--依赖注入业务逻辑组件-->
<property name="ms" ref="myService" />
</bean>

以上代码的意思会在loginAction的代码里引用MyServiceImpl类,但是只需要用ms代替就可以
例如:
 public String execute() throws Exception{
    ms.sayhello();
}
正常情况应该 new MyServiceImpl,但是通过XML配置之后就直接用以上代码就可以实现
new 的效果。

以下是该项目的配置文件呈现:

 <?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> <!-- 加入SpringMVC的库支持 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 加入Context支持 -->
<context:annotation-config></context:annotation-config>
<!-- 配置使用Annotation的包范围 -->
<context:component-scan base-package="org.liky.sina.dao.impl,org.liky.sina.action"></context:component-scan> <!-- 配置数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.gjt.mm.mysql.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/sina_news"></property>
<property name="username" value="root"></property>
<property name="password" value="admin"></property>
</bean> <!-- 配置一个模板类 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean> <!-- 配置自动管理连接的一个事务操作支持 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property> <!-- 配置事务处理方式 *表示service中的所有方法都要进行事务处理。PROPAGATION_REQUIRED表示事务处理方式,有以下三种选择:
PROPAGATION_REQUIRED:正常事务处理
PROPAGATION_REQUIRED_NEWS:每个操作单独进行一个事务处理
PROPAGATION_REQUIRED_NEVER:不使用事务,出错后后面的不进行添加
--> <property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property> </bean> <!-- 配置事务管理器的作用范围 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
<property name="beanNames">
<list>
<value>*DAOImpl</value>
</list>
</property>
</bean> </beans>

4、配置web.xml文件

  这个文件是需要在里面让服务器启动时,可以自动加载spring的配置文件。

  代码呈现:

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>SinaNewsSpringMVC</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param> <!-- 手工配置加载SpringMVC的支持库和跳转路径 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> <!-- 添加过滤器 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.liky.sina.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

5、添加log4j.properties文件至src根目录

Log4j,Apache的一个开源项目,作用:

     可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等;

       可以控制每一条日志的输出格式;

        通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

     此外,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

 ### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=warn, stdout log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug ### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug ### log just the SQL
#log4j.logger.org.hibernate.SQL=debug ### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug ### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug ### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug ### log cache activity ###
#log4j.logger.org.hibernate.cache=debug ### log transaction activity
#log4j.logger.org.hibernate.transaction=debug ### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug ### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

6、实现DAO操作类 

之后启动服务器进行测试,如果启动后没有报错,那就表示环境配置成功,可以正常使用。

下面就开始编写DAO操作。

对于DAO接口是没有变化的,所以可以直接拷贝过来

这里不需要再编写工厂类,因为Spring可以自动帮助创建对象。

实现类需要交给Spring来进行管理和控制,并且简化jdbc代码操作

代码如下:

 package org.liky.sina.dao.impl;

 import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List; import org.liky.sina.dao.INewsDAO;
import org.liky.sina.vo.News;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Component; @Component
public class NewsDAOImpl extends JdbcDaoSupport implements INewsDAO,RowMapper<News> { @Autowired
public NewsDAOImpl(JdbcTemplate jdbcTemplate) {
super.setJdbcTemplate(jdbcTemplate);
} public void doCreate(News news) throws Exception {
String sql="insert into news (id,title,description,url) values (?,?,?,?)"; super.getJdbcTemplate().update(sql, news.getId(),news.getTitle(),news.getDescription(),news.getUrl());
} public News findById(int id) throws Exception {
String sql="select id,title,description,url from news where id=?";
News news=super.getJdbcTemplate().queryForObject(sql,new Object[]{id},this); return news;
} public List<News> findByIds(Integer[] ids, int start, int pageSize)
throws Exception {
StringBuilder sql = new StringBuilder(
"SELECT id,title,description,url FROM new_news WHERE id IN (");
if (ids != null && ids.length > 0) {
for (int id : ids) {
sql.append(id);
sql.append(",");
}
// 第一个 ? 表示开始的记录数,第二个 ? 表示每页显示的记录数。
String resultSQL = sql.substring(0, sql.length() - 1)
+ ") LIMIT ?,?";
List<News> allNews = super.getJdbcTemplate().query(resultSQL,
new Object[] { start, pageSize }, this);
return allNews;
}
return null;
} public int getAllCount(Integer[] ids)throws Exception{
StringBuilder sql=new StringBuilder("select count(id) from new_news where id in ("); if(ids!=null&&ids.length>0){
for(int id:ids){
sql.append(id);
sql.append(",");
}
// 第一个 ? 表示开始的记录数,第二个 ? 表示每页显示的记录数。
String resultSQL = sql.substring(0, sql.length() - 1) + ")";
int count = super.getJdbcTemplate().queryForInt(resultSQL);
return count;
}
return 0;
} public News mapRow(ResultSet rs, int arg1) throws SQLException {
News news=new News();
news.setId(rs.getInt(1));
news.setTitle(rs.getString(2));
news.setDescription(rs.getString(3));
news.setUrl(rs.getString(4));
return news; } }

7、修改页面源码

表单部分进行一些简单的调整,加入了form标签相关的配置。主要在action的值改为了search.do

【1】index.jsp修改

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>新浪新闻热词搜索</title>
</head> <body>
<center>
<form action="search.do" method="post">
请输入查询关键字:
<input type="text" name="keyword">
<input type="submit" value="查询">
</form>
</center>
</body>
</html>

【2】result.jsp修改

 <%@page import="org.liky.sina.vo.News"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>新浪新闻搜索</title>
</head> <body>
<center>
<%
List<News> allNews = (List<News>)request.getAttribute("allNews");
%>
<table width="80%">
<%
for (News n : allNews) { %>
<tr>
<td>
<a href="<%=n.getUrl() %>" target="_blank"><%=n.getTitle() %></a> <br>
<%=n.getDescription() %>
<hr/>
</td>
</tr>
<%
} %>
</table> <%
int cp = (Integer)request.getAttribute("currentPage");
int allPages = (Integer)request.getAttribute("allPages");
%>
<form id="split_page_form" action="search.do" method="post">
<input type="hidden" name="currentPage" id="cp" value="<%=cp %>" />
<input type="button" <%=cp == 1?"disabled":"" %> value="首页" onclick="changeCp(1);">
<input type="button" <%=cp == 1?"disabled":"" %> value="上一页" onclick="changeCp(<%=cp - 1 %>);">
<input type="button" <%=cp == allPages?"disabled":"" %> value="下一页" onclick="changeCp(<%=cp + 1 %>);">
<input type="button" <%=cp == allPages?"disabled":"" %> value="尾页" onclick="changeCp(<%=allPages %>);">
第 <%=cp %> 页 / 共 <%=allPages %> 页
<br>
请输入查询关键字:<input type="text" name="keyword" value="<%=request.getParameter("keyword")%>">
<input type="submit" value="查询">
</form>
<script type="text/javascript">
function changeCp(newcp) {
// 改变当前页数
document.getElementById("cp").value = newcp;
// 提交表单
document.getElementById("split_page_form").submit();
}
</script> </center>
</body>
</html>

8、编写控制器来自动接收参数,以及进行数据操作

之后需要编写SpringMVC的控制器来自动接收参数,并进行数据操作。

代码呈现:

 package org.liky.sina.action;

 import java.util.List;

 import javax.annotation.Resource;

 import org.liky.sina.dao.INewsDAO;
import org.liky.sina.utils.HDFSUtils;
import org.liky.sina.vo.News;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView; @Controller
public class NewsAction {
private INewsDAO newsdao; @RequestMapping(value="/search.do")
public ModelAndView search(@RequestParam String keyword,@RequestParam(defaultValue="1") int currentPage){
ModelAndView mv= new ModelAndView();
//一页显示10条数据
int pageSize=10; try{
Integer[] ids=HDFSUtils.getIdsByKeyword(keyword);
//根据这些id查询相应的结果
List<News> allNews=newsdao.findByIds(ids, (currentPage-1), pageSize); int count=newsdao.getAllCount(ids);
//计算一个关键词读取的数据显示总页数
int allPages=count/pageSize;
if(count%pageSize!=0){
allPages++;
} //结果传递回页面显示
mv.addObject("allNews",allNews);
mv.addObject("allPages", allPages);
mv.addObject("currentPage", currentPage); //切换到页面上
mv.setViewName("/result.jsp");
}catch(Exception e){
e.printStackTrace();
} return mv;
} @Resource(name="newsDAOImpl")
public void setNewsdao(INewsDAO newsdao){
this.newsdao=newsdao; }
}

9、过滤器解决乱码问题

测试时会有乱码出现,因此还要编写一个过滤器来处理乱码。

如果是MyEclipse的乱码问题,只需修改:

SpringMVC实现垂直搜索引擎

【1】过滤器代码呈现:

 package org.liky.sina.filter;
/**
* 过滤器,解决网页乱码的问题
*/
import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class EncodingFilter implements Filter { @Override
public void destroy() {
} @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
//修改编码格式为UTF-8
arg0.setCharacterEncoding("UTF-8");
arg2.doFilter(arg0, arg1);
} @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub } }

【2】在web.xml中配置这个过滤器:

 <filter>
<filter-name>encoding</filter-name>
<filter-class>org.liky.sina.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

10、结果显示

关于其他的代码在参考《Lucene搜索引擎+HDFS+MR完成垂直搜索》。

运行结果如下:

 控制台显示:

SpringMVC实现垂直搜索引擎

浏览器index.jsp显示:

SpringMVC实现垂直搜索引擎

搜索结果   result.jsp  显示,尾部实现了分页功能,并且还可以进行搜索:

SpringMVC实现垂直搜索引擎

11、总结

    首先上一篇结尾存在的乱码问题在此处第九部分,给出了过滤器的方法,将编码格式改为UTF-8,已经解决了。

  关于垂直搜索引擎,是针对某一个行业的专业搜索引擎(本次项目是对新浪新闻的数据收集,爬取深度为5),是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。

  本篇用SpringMVC框架的技术完成数据的垂直搜索,相比来说,结构更加清晰,难点在于两个配置文件的修改,以及在代码中使用配置文件。

  思路流程:

    1、  DAO操作类根据首页搜索框关键词的输入,获取HDFS的id,以便从数据库提取一组信息;

    2、  配置文件实现了数据库的连接,并简化了DAO的流程实现;

    3、  SpringMVC的控制器自动接收参数,并进行数据操作;

    4、  JSP文件接收控制器传递的数据,呈现在结果页面。

  

  

SpringMVC实现垂直搜索引擎的更多相关文章

  1. 【课程分享】基于Lucene4&period;6&plus;Solr4&period;6&plus;Heritrix1&period;14&plus;S2SH实战开发从无到有垂直搜索引擎

    对这个课程有兴趣的朋友,能够加我的QQ2059055336和我联系,能够和您分享.  课程介绍:最有前途的软件开发技术--搜索引擎技术  搜索引擎作为互联网发展中至关重要的一种应用,已经成为互联网各个 ...

  2. 用开源软件建垂直搜索引擎 转载 http&colon;&sol;&sol;news&period;cnblogs&period;com&sol;n&sol;60041&sol;

    用Solr.Nutch等开源软件来构建电子元器件垂直搜索引擎涉及很多实现细节,本文结合实际应用系统对数据采集.中文搜索.结果输出.分页处理.整合数据库等重点问题提出了切实可行的解决方法. 用开源软件建 ...

  3. &lbrack;原创&rsqb;一种基于Python爬虫和Lucene检索的垂直搜索引擎的实现方法介绍

    声明:本文首发在博客园晨星落羽,Shulin_Cao和lvmememe首页,转载请注明出处. 前言 2016.5到2017.5,我们三人(lvmememe,Shulin_Cao,晨星落羽)共同完成了一 ...

  4. &lbrack;Search Engine&rsqb; 搜索引擎分类和基础架构概述

    大家一定不会多搜索引擎感到陌生,搜索引擎是互联网发展的最直接的产物,它可以帮助我们从海量的互联网资料中找到我们查询的内容,也是我们日常学习.工作和娱乐不可或缺的查询工具.之前本人也是经常使用Googl ...

  5. 搜索引擎solr和elasticsearch

    刚开始接触搜索引擎,网上收集了一些资料,在这里整理了一下分享给大家. 一.关于搜索引擎 搜索引擎(Search Engine)是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组 ...

  6. Elastic Stack之搜索引擎基础

    Elastic Stack之搜索引擎基础 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搜索引擎概述 1>.什么是搜索引擎 搜索引擎(Search Engine)是指根 ...

  7. nutch从搜索引擎到网络爬虫

    人物介绍 姓名:DougCutting 个人名望:开发出开源全文检索引擎工具包Lucene. 个人简介/主要荣誉:除了 Lucene,还开发了著名的网络爬虫工具 Nutch,分布式系统基础架构Hado ...

  8. SEO搜索引擎

    搜索引擎 搜索引擎(Search Engine)是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统.搜索引擎 ...

  9. 海量数据搜索---demo展示百度、谷歌搜索引擎的实现

    在我们平常的生活工作中,百度.谷歌这些搜索网站已经成为了我们受教解惑的学校,俗话说得好,“有问题找度娘”.那么百度是如何在海量数据中找到自己需要的数据呢?为什么它搜索的速度如此之快?我们都知道是因为百 ...

随机推荐

  1. 关于laravel 5&period;3 使用redis缓存出现 找不到Class &&num;39&semi;Predis&bsol;Client&&num;39&semi; not found的问题

    昨天使用5.3.版本的laravel框架开发公司新项目, 发现将cache和session设置为了redis,执行了一下首页访问. 如图: laravel 版本号 简单配置一下控制器路由, Route ...

  2. css面包屑导航编号

    content:counter(flag);counter-increment: flag;-->一般给导航条编号1,2,3

  3. wdcp 打开网页显示 Apache 2 Test Page powered by CentOS

    是因为更新过系统,安装并更新了系统自带的apache 执行这个命令即可 #ln -sf /www/wdlinux/init.d/httpd /etc/rc.d/init.d/httpd#reboot

  4. Spring学习(一)——Spring中的依赖注入简介【转】

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  5. 分享自己动手弄的基于Rime的新世纪五笔输入法码表

    实验室新搞了一台iMac,没有支持新世纪的码表的中文输入法啊.搜索半天大家推荐用Rime(鼠须管)来挂接新世纪码表.不知道还有没有其它支持外挂码表的Mac版输入法,暂时只有搞这个了.看了一下别人已经做 ...

  6. placeholder颜色

    ::-moz-placeholder{color:#b9bfc1;} // Firefox::-webkit-input-placeholder{color:#b9bfc1;} // Chrome, ...

  7. Python打包工具setuptools的使用

    将我们写的Python程序发布成包后,可以使其能够安装使用. 在项目上测试的时候,某些情况下,可以将Python打包,然后上传到测试服务器,安装测试. setuptools是常用的打包工具. 一个简单 ...

  8. &period;net webapi跨域方法整理

    方法一 在Web.Config里面加上了配置信息: <httpProtocol> <customHeaders> <add name="Access-Contr ...

  9. mybatis example 使用AND 和OR 联合查询

    mybatis example 使用AND 和OR 联合查询 ViewPsmsgconsultExample example=new ViewPsmsgconsultExample(); ViewPs ...

  10. 转载 深入理解java类加载器

    1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...