2015年创业中遇到的技术有关问题:21-30

2015年创业中遇到的技术问题:21-30
21.快速清空表中的数据。
有个ip库的表,数据量几十万。
想在开发阶段,清空。
通过mysql-front和mysql控制台,都删除失败。
反应很慢,还有诸如lock失败的错误。

解决办法:复制表的创建结构,比如
CREATE TABLE `ip_info` (
  `ipbegin` varchar(20) DEFAULT NULL,
  `ipend` varchar(20) DEFAULT NULL,
  `zone` varchar(50) DEFAULT NULL,
  `company` varchar(200) DEFAULT NULL,
  `ipbeginInt` bigint(20) DEFAULT NULL,
  `ipendInt` bigint(20) DEFAULT NULL,
  `province` varchar(50) DEFAULT NULL,
  KEY `ipbegin_int` (`ipbeginInt`),
  KEY `ipend_int` (`ipendInt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

直接删除这个表,drop table ip_info,非常迅速。
然后再重新建立这个表,执行上面的“create table ip_info”语句。

22.Putty设置默认用户和默认编码。
每次登录,都需要输入用户名,烦死了。输入密码,还可以理解。
每次打开文件,都是乱码,还得手动在transaction下,修改编码为“utf-8”,烦死了。

解决办法:
    putty是个很好的连接linux的客户端工具,但是用putty时,时常出现乱码问题,这时候需要在Translation中设置一下。
   但是每次连接都要设就非常麻烦了,这时候,可以在保存session的时候,先设好,以后从保存list中进入,这样就不需要手动设编码了。
   
   默认用户名,也是这样,Connection-Data-Auto login username。

参考资料:http://blog.csdn.net/dawnming/article/details/7076637
(只有设置编码是参考的这个,发现和设置默认用户名是一个道理,之前在别处看到过设置默认用户名)

23.Windows下的bat和Linux上的sh。
在Linux上执行命令的时候,按tab提示 catalish. 会卡住,因为有2个选项“catalish.sh”和“catalish.bat”。
比较好的办法是,把Linux上的“catalish.bat”删掉,把Windows上的“catalish.sh”删掉。
startup.bat,shutdown.bat,catalish.bat等“*.bat”都干掉。

24.Linux下的Tomcat的catalish配置JVM参数。
在第235行,加类似的配置:
 JAVA_OPTS="$JAVA_OPTS  -Dp2p.config_path=/var/tomcat/config/  -Dlog4jOutputPath=/var/tomcat/logs -Xms256m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m"

 在这个几行注释的下面。 
 # Uncomment the following line to make the umask available when using the
233 # org.apache.catalina.security.SecurityListener
234 #JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"

尝试放在前一行,貌似不行呀。

25.跨域一点问题。
项目中解决Less的访问,大致了解了下,不想用Less,所以也不需要配置乱七八糟的Filter。
做个记录,今后说不定用得上。

CORS介绍

   它在*上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源。而这种访问是被同源策略所禁止的。CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。 它是一个妥协,有更大的灵活性,但比起简单地允许所有这些的要求来说更加安全。

   而W3C的官方文档目前还是工作草案,但是正在朝着W3C推荐的方向前进。

   简言之,CORS就是为了让AJAX可以实现可控的跨域访问而生的。
  
<filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
    <init-param>
      <param-name>cors.allowOrigin</param-name>
      <param-value>*</param-value>
    </init-param>
    <init-param>
      <param-name>cors.supportedMethods</param-name>
      <param-value>GET, POST, HEAD, PUT, DELETE</param-value>
    </init-param>
    <init-param>
      <param-name>cors.supportedHeaders</param-name>
      <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
    </init-param>
    <init-param>
      <param-name>cors.exposedHeaders</param-name>
      <param-value>Set-Cookie</param-value>
    </init-param>
    <init-param>
      <param-name>cors.supportsCredentials</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CORS</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  网上找了个类似的资料:http://www.verydemo.com/demo_c199_i15317.html。
  
26.MySQL 按指定字段自定义列表排序

SELECT * FROM bank 
ORDER BY FIELD(`id`,20, 22, 21) desc,
id desc,FIELD('status',21,1)

要注意的是, FIELD 后面是没有空格的.
因此, 完整的 SQL 为:
SELECT * FROM `MyTable` 
WHERE `id` IN (1, 7, 3, 5) 
ORDER BY FIELD(`id`, 5, 3, 7, 1)
常见应用
 SELECT * FROM `MyTable` 
WHERE `name` IN ('张三', '李四', '王五', '孙六') 
ORDER BY FIELD(`name`, '李四', '孙六', '张三', '王五')

参考资料:http://blog.csdn.net/aidenliu/article/details/7554860

27.Jquery选择器语法。
$("#"+parentId+">a :first").addClass("tab-high"); 
超链接a后,不应该有空格。

28.SiteMesh就是一个废材。
感觉没啥多大用处,不灵活。
直接用include更好。

29.根据参数类型,执行不同的构造函数,感觉容易出错。
/**
 * 分
 */
public Money(Long cent) {
this.cent = cent;
}

/**
 * 元
 */
public Money(Double amount) {
if (amount != null) {
Double d = DoubleUtil.mul(amount, 100);
this.cent = d.longValue();
}
}
可能存在这样的需求,前端要求元必须是整数Integer,后端用Integer接收,再构造,就出错了。
30.SpringMVC拦截404。
第1种方式:Tomcat直接处理
web.xml
<error-page>  
    <error-code>404</error-code>  
    <location>/error/404.htm</location>  
</error-page>  
这种只能展示纯静态的页面,非常不灵活。

第2种方式:利用Spring MVC的最精确匹配
@Controller
public class UrlNotFoundController {
@RequestMapping("*")
public String test404(){
//TODO
return "404Page";
}
}

在网上找到这样的方法,利用SpringMVC的精确匹配,从而在其它Controller找不到对应请求的时候,来处理404。
但是,这种方式也有问题,只能拦截一部分。

比如,如果有这个一个Controller
@Controller("/home")
public class HomeController{
@RequestMapping("a")
public String a(){
      //
}
}

直接访问: http://localhost:8080/b.html,会被UrlNotFoundController处理。
但是http://localhost:8080/home/b.html,就不会被UrlNotFoundController处理。

这说明,通过精准匹配也是有局限性的。



第3种方式:自定义org.springframework.web.servlet.DispatcherServlet,重载noHandlerFound方法。
<servlet>
<servlet-name>theDispatcher</servlet-name>
<servlet-class>base.web.MyDispatchServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc-servlet.xml</param-value>
</init-param>
<init-param>
<param-name>fileNotFondUrl</param-name>
<param-value>/error/404</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>theDispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
public class MyDispatchServlet extends DispatcherServlet {

private static final long serialVersionUID = 1L;

private static final UrlPathHelper urlPathHelper = new UrlPathHelper();
private String fileNotFondUrl = "/error/404.html";
public void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (pageNotFoundLogger.isWarnEnabled()) {
String requestUri = urlPathHelper.getRequestUri(request);
pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + requestUri +
"] in DispatcherServlet with name '" + getServletName() + "'");
}
response.sendRedirect(request.getContextPath() + fileNotFondUrl);
}

public String getFileNotFondUrl() {
return fileNotFondUrl;
}

public void setFileNotFondUrl(String fileNotFondUrl) {
this.fileNotFondUrl = fileNotFondUrl;
}
}

默认的DispatchServlet的noHandlerFound方法。
protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (pageNotFoundLogger.isWarnEnabled()) {
String requestUri = urlPathHelper.getRequestUri(request);
pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + requestUri +
"] in DispatcherServlet with name '" + getServletName() + "'");
}
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
直接返回HTTP404。

特别需要说明的是:
  自定义之后,不能再使用
  <!-- <mvc:default-servlet-handler /> -->
  
  通常情况下,使用这个配置,可以让SpringMVC相应js、css等静态页面,在合适的路径,自动去找。
  注释之后,就只能手动响应静态资源等请求了。
  2种方式:
  第1种:Tomcat处理。
  配置
  <servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
  
  第2种:SpringMVC处理
  <mvc:resources mapping="/kindeditor/upload/image/**"
location="file:${kindeditorImagePath}/kindeditor/upload/image/**" />
  
  如果使用了“<mvc:default-servlet-handler />”
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
  DispatchServlet上述代码的mappedHandler就不为空了,因此无法进入noHandlerFound方法。
  
  参考资料:http://blog.csdn.net/u012345283/article/details/39718245