Unit03: 容器对路径的处理 、 Servlet特性
Unit03: 容器对路径的处理 、 Servlet特性
案例一:查询,增加员工:
- 重定向
- 处理请求资源路径
目录结构:
案例代码:
package dao; import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; import entity.Emp; public class EmpDao implements Serializable { public List<Emp> findAll() {
List<Emp> list = new ArrayList<Emp>(); Emp e1 = new Emp();
e1.setEmpno(1);
e1.setEname("唐僧");
e1.setJob("师父");
e1.setSal(9000.0);
list.add(e1); Emp e2 = new Emp();
e2.setEmpno(2);
e2.setEname("悟空");
e2.setJob("徒弟");
e2.setSal(5000.0);
list.add(e2); Emp e3 = new Emp();
e3.setEmpno(3);
e3.setEname("八戒");
e3.setJob("徒弟");
e3.setSal(6000.0);
list.add(e3); return list;
} public void save(Emp e) {
System.out.println(
"增加员工:" + e.getEname());
} }
EmpDao.java
package entity; import java.io.Serializable; public class Emp implements Serializable { private Integer empno;
private String ename;
private String job;
private Double sal; public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
} }
Emp.java
package web; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import dao.EmpDao;
import entity.Emp; public class AddEmpServlet extends HttpServlet { @Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//接收浏览器传入的数据
String ename = req.getParameter("ename");
String job = req.getParameter("job");
String sal = req.getParameter("sal");
//增加保存这些数据
Emp e = new Emp();
e.setEname(ename);
e.setJob(job);
if(sal != null && !sal.equals("")) {
e.setSal(new Double(sal));
}
new EmpDao().save(e);
//重定向到查询页面:
//建议浏览器自己去访问查询页面
//当前:/EmpManager/addEmp
//目标:/EmpManager/findEmp
res.sendRedirect("findEmp");
} }
AddEmpServlet.java
package web; 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 dao.EmpDao;
import entity.Emp; public class FindEmpServlet extends HttpServlet { @Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//查询所有的员工
EmpDao dao = new EmpDao();
List<Emp> list = dao.findAll();
//向浏览器输出响应信息
res.setContentType(
"text/html;charset=utf-8");
PrintWriter out = res.getWriter();
//当前:/EmpManager/findEmp
//目标:/EmpManager/add_emp.html
out.println("<a href='add_emp.html'>增加</a>");
out.println("<table border='1' cellspacing='0' width='30%'>");
out.println(" <tr>");
out.println(" <td>编号</td>");
out.println(" <td>姓名</td>");
out.println(" <td>职位</td>");
out.println(" <td>薪资</td>");
out.println(" </tr>");
if(list != null) {
for(Emp e : list) {
out.println("<tr>");
out.println(" <td>"+e.getEmpno()+"</td>");
out.println(" <td>"+e.getEname()+"</td>");
out.println(" <td>"+e.getJob()+"</td>");
out.println(" <td>"+e.getSal()+"</td>");
out.println("</tr>");
}
}
out.println("</table>");
out.close();
} }
FindEmpServlet.java
这个代码把上面两个方法合并到这里了,并用 *.do 来访问;
package web; 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 dao.EmpDao;
import entity.Emp; /**
* 路径规范:
* 查询员工: /findEmp.do
* 增加员工: /addEmp.do
*/
public class MainServlet extends HttpServlet { @Override
protected void service(
HttpServletRequest req,
HttpServletResponse res)
throws IOException, ServletException{
//获取请求路径
String p = req.getServletPath();
//根据规范处理路径
if("/findEmp.do".equals(p)) {
findEmp(req,res);
} else if("/addEmp.do".equals(p)) {
addEmp(req,res);
} else {
throw new RuntimeException("查无此页");
}
} protected void findEmp(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//查询所有的员工
EmpDao dao = new EmpDao();
List<Emp> list = dao.findAll();
//向浏览器输出响应信息
res.setContentType(
"text/html;charset=utf-8");
PrintWriter out = res.getWriter();
//当前:/EmpManager/findEmp
//目标:/EmpManager/add_emp.html
out.println("<a href='add_emp.html'>增加</a>");
out.println("<table border='1' cellspacing='0' width='30%'>");
out.println(" <tr>");
out.println(" <td>编号</td>");
out.println(" <td>姓名</td>");
out.println(" <td>职位</td>");
out.println(" <td>薪资</td>");
out.println(" </tr>");
if(list != null) {
for(Emp e : list) {
out.println("<tr>");
out.println(" <td>"+e.getEmpno()+"</td>");
out.println(" <td>"+e.getEname()+"</td>");
out.println(" <td>"+e.getJob()+"</td>");
out.println(" <td>"+e.getSal()+"</td>");
out.println("</tr>");
}
}
out.println("</table>");
out.close();
} protected void addEmp(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//接收浏览器传入的数据
String ename = req.getParameter("ename");
String job = req.getParameter("job");
String sal = req.getParameter("sal");
//增加保存这些数据
Emp e = new Emp();
e.setEname(ename);
e.setJob(job);
if(sal != null && !sal.equals("")) {
e.setSal(new Double(sal));
}
new EmpDao().save(e);
//重定向到查询页面:
//建议浏览器自己去访问查询页面
//当前:/EmpManager/addEmp.do
//目标:/EmpManager/findEmp.do
res.sendRedirect("findEmp.do");
} }
MainServlet.java
package web; 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 dao.EmpDao;
import entity.Emp; /**
* 路径规范:
* 查询员工: /findEmp.do
* 增加员工: /addEmp.do
*/
public class MainServlet extends HttpServlet { @Override
protected void service(
HttpServletRequest req,
HttpServletResponse res)
throws IOException, ServletException{
//获取请求路径
String p = req.getServletPath();
//根据规范处理路径
if("/findEmp.do".equals(p)) {
findEmp(req,res);
} else if("/addEmp.do".equals(p)) {
addEmp(req,res);
} else {
throw new RuntimeException("查无此页");
}
} protected void findEmp(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//查询所有的员工
EmpDao dao = new EmpDao();
List<Emp> list = dao.findAll();
//向浏览器输出响应信息
res.setContentType(
"text/html;charset=utf-8");
PrintWriter out = res.getWriter();
//当前:/EmpManager/findEmp
//目标:/EmpManager/add_emp.html
out.println("<a href='add_emp.html'>增加</a>");
out.println("<table border='1' cellspacing='0' width='30%'>");
out.println(" <tr>");
out.println(" <td>编号</td>");
out.println(" <td>姓名</td>");
out.println(" <td>职位</td>");
out.println(" <td>薪资</td>");
out.println(" </tr>");
if(list != null) {
for(Emp e : list) {
out.println("<tr>");
out.println(" <td>"+e.getEmpno()+"</td>");
out.println(" <td>"+e.getEname()+"</td>");
out.println(" <td>"+e.getJob()+"</td>");
out.println(" <td>"+e.getSal()+"</td>");
out.println("</tr>");
}
}
out.println("</table>");
out.close();
} protected void addEmp(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//接收浏览器传入的数据
String ename = req.getParameter("ename");
String job = req.getParameter("job");
String sal = req.getParameter("sal");
//增加保存这些数据
Emp e = new Emp();
e.setEname(ename);
e.setJob(job);
if(sal != null && !sal.equals("")) {
e.setSal(new Double(sal));
}
new EmpDao().save(e);
//重定向到查询页面:
//建议浏览器自己去访问查询页面
//当前:/EmpManager/addEmp.do
//目标:/EmpManager/findEmp.do
res.sendRedirect("findEmp.do");
} }
web.xml
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>增加员工</title>
</head>
<body>
<!--
当前:/EmpManager/add_emp.html
目标:/EmpManager/addEmp.do
-->
<form action="addEmp.do" method="post">
<p>
姓名:<input type="text" name="ename"/>
</p>
<p>
职位:<input type="text" name="job"/>
</p>
<p>
薪资:<input type="text" name="sal"/>
</p>
<p><input type="submit" value="保存"/></p>
</form>
</body>
</html>
add_emp.html
案例二:演示路径输出,访问项目的三种方式:
package web; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class AbcServlet extends HttpServlet { @Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//获取访问路径
System.out.println(
req.getContextPath());
System.out.println(
req.getServletPath());
System.out.println(
req.getRequestURI());
System.out.println(
req.getRequestURL());
//若没有设置响应信息的话,服务器
//依然会向浏览器做出默认的响应,
//但响应的内容为空.
} }
PathServlet.java
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>servlet3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <servlet>
<servlet-name>abc</servlet-name>
<servlet-class>web.AbcServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<!-- 1.精确匹配 -->
<!-- <url-pattern>/abc</url-pattern> -->
<!-- 2.通配符 -->
<!-- <url-pattern>/*</url-pattern> -->
<!-- 3.后缀(不要写/) -->
<url-pattern>*.duang</url-pattern>
</servlet-mapping> </web-app>
web.xml
案例三:演示Servlet程序调度规则:
package web; import java.io.IOException; import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class DemoServlet extends HttpServlet { //DemoServlet,实例化 == new 调用一次
public DemoServlet() {
System.out.println("实例化DemoServlet");
} //init,初始化 爷爷的方法 调用一次
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("初始化DemoServlet");
} //service,执行程序逻辑 访问多少次,调用多少次
@Override
protected void service(
HttpServletRequest arg0,
HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("调用DemoServlet");
} //destroy,关闭Servlet 调用一次
@Override
public void destroy() {
super.destroy();
System.out.println("销毁DemoServlet");
} }
SysServlet.java
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>servlet4</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <servlet>
<servlet-name>demo</servlet-name>
<servlet-class>web.DemoServlet</servlet-class>
<!-- 这里可以控制,启动时第1个加载此Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping> </web-app>
web.xml
后一天讲的内容:
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>servlet4</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <servlet>
<servlet-name>demo</servlet-name>
<servlet-class>web.DemoServlet</servlet-class>
<!-- 启动时第2个加载此Servlet -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>login</servlet-name>
<servlet-class>web.LoginServlet</servlet-class>
<init-param>
<param-name>maxonline</param-name>
<param-value>3000</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>findDept</servlet-name>
<servlet-class>web.FindDeptServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>findDept</servlet-name>
<url-pattern>/findDept</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>findEmp</servlet-name>
<servlet-class>web.FindEmpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>findEmp</servlet-name>
<url-pattern>/findEmp</url-pattern>
</servlet-mapping> <!--
给所有的Servlet预置参数,该参数由context
对象自动读取.
Tomcat启动时首先就会创建context对象,它会
给每个项目创建唯一的一个context.
context内部有静态块,首次调用时就执行,
此块内加载了web.xml中的参数.
-->
<context-param>
<param-name>size</param-name>
<param-value>10</param-value>
</context-param> <servlet>
<servlet-name>init</servlet-name>
<servlet-class>web.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet> <servlet>
<servlet-name>up</servlet-name>
<servlet-class>web.UpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>up</servlet-name>
<url-pattern>/up</url-pattern>
</servlet-mapping> </web-app>
web.xml
ServletConfig,一对一 和 init 调用时机讲解:
package web; import java.io.IOException; import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { /**
* 1.config对象由tomcat创建及传入
*
* LoginServlet servlet = new LoginServlet();
* //Tomcat每创建一个Servlet后,就会立刻给它
* //创建一个config对象.
* //config内有静态块,调用时加载参数(首次访问)
* ServletConfig cfg = new ServletConfig();
* //通过init方法传入此config对象
* servlet.init(cfg);
* //父类的init(cfg)方法内部调用了init()
*
* 2.使用config不是必须要重写init(),
* 若在service()中调用config,通过父类
* 提供的getServletCofig()就可以获取它.
* 该方法返回的config就是init()所传入
* 的那个config.
*
* */ @Override
public void init(ServletConfig config) throws ServletException {
System.out.println("调用有参的init()");
super.init(config);
} @Override
public void init() throws ServletException {
System.out.println("调用无参的init()");
super.init();
} @Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//获取在线人数最大值
ServletConfig cfg = getServletConfig();
String maxonline =
cfg.getInitParameter("maxonline");
System.out.println(maxonline);
} }
LoginServlet.java
ServletContext,一对多:
package web; import java.io.IOException; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class FindDeptServlet extends HttpServlet { @Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//获取每页显示的行数
ServletContext ctx = getServletContext();
String size = ctx.getInitParameter("size");
System.out.println(size);
//统计流量
Integer count = (Integer)
ctx.getAttribute("count");
ctx.setAttribute("count", ++count);
System.out.println("流量:"+count);
} }
FindDeptServlet.java
package web; import java.io.IOException; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class FindEmpServlet extends HttpServlet { @Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//获取每页显示的行数
ServletContext ctx = getServletContext();
String size = ctx.getInitParameter("size");
System.out.println(size);
//统计流量
Integer count = (Integer)
ctx.getAttribute("count");
ctx.setAttribute("count", ++count);
System.out.println("流量:"+count);
} }
FindEmpServlet.java
这个文件只是初始化变量,还是访问上面这两个文件,进行测试程序,
package web; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; /**
* 该Servlet不用来处理任何请求,只是用来
* 在Tomcat启动时初始化一些数据而已.
* 在你工作时会发现很多项目中都有1个/多个
* 这样的Servlet.
*/
public class InitServlet extends HttpServlet { @Override
public void init() throws ServletException {
super.init();
//将流量初始化为0
ServletContext ctx = getServletContext();
ctx.setAttribute("count", 0);
} }
InitServlet.java
演示线程安全,增加 synchronized(this) 保证线程安全:
package web; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class UpServlet extends HttpServlet { private Double salary = 3000.0; @Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
synchronized(this) {
//模拟涨工资
salary += 100;
//模拟网络延迟
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
res.setContentType(
"text/html;charset=utf-8");
PrintWriter out = res.getWriter();
out.println(salary);
out.close();
}
}
}
UpServlet.java
Unit03: 容器对路径的处理 、 Servlet特性的更多相关文章
- servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解1
servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解 (2013-06-19 19:30:40) 转载▼ servlet的非线程安全,action的线程安全 对提交 ...
- Servlet主要相关类核心类 容器调用的过程浅析 servlet解读 怎么调用 Servlet是什么 工作机制
WEB简介 Web项目 是 B/S结构 浏览器/服务器模式的 浏览器发起请求,服务器作出响应 请求的发起和响应使用HTTP协议进行通讯 所谓协议也就是一种固定格式 而Socket是应用 ...
- JSP(2)—绝对路径与相对路径、配置Servlet与Servlet注解
一.绝对路径和相对路径 ①开发时建议使用据对路径,使用绝对路径肯定没有问题,但是用相对路径可能会有问题. 在由Servlet转发到JSP页面时,此时在浏览器地址栏显示Sevvlet路径,若JSP页面的 ...
- Docker容器日志路径
/var/lib/docker/containers/容器ID/容器ID-json.log 可以通过这个路径收集日志到ES中
- Servlet特性研究之异步模式
Servlet只有同步模型是怎样的? 异步处理是Servlet3.0版本的重要功能之一,分析异步处理模型之前,先看看同步处理的过程是怎样的: 客户端发起HTTP请求一个动态Servlet API,请求 ...
- Tomcat容器虚拟路径设置
1.[官方文档]在tomcat\conf下server.xml中找到 <Host name="localhost" appBase="webapps" u ...
- Docker 查看容器映射路径
使用以下命令:container_name 是容器的名字,也可以写容器的ID. docker inspect container_name | grep Mounts -A 20 docker ins ...
- Servlet容器请求处理
红色部分为本章所述模块 所讲述的请求流程模块,大家已经很清楚了.那怎么给大家去讲的更清晰,大家理解的更容易呢?当然是,带着问题去学习,吸收或许会更快些啦.:) 开篇之前,给大家提以下几个问题,这些问题 ...
- Servlet容器的启动(Tomcat为例)
一.容器简介 在tomcat容器等级中,context容器直接管理servlet在容器中的包装类Wrapper,所以Context容器如何运行将直接影响servlet的工作方式. tomcat容器模型 ...
随机推荐
- Vim代码缩进设置
前段配置VPS,无奈只能使用Vim编辑Python代码,比较头疼的没法设置自动缩进,所以搜索了相关的配置,特记录如下. 将以下的设置加入到~/etc/vim/.vimrc中: set sw=4 set ...
- MySQL相关问题总结
希望此贴能够将MySQL安装周围的问题总结清楚,也免得自己再遇到问题时而不知所措.本帖中所有关于MySQL的问题均涉及到两个平台:Ubuntu 和 Windows(本人没有Mac) 问题1:MySQL ...
- [C#]委托实例分析(附源码)
一直都听说C#中的委托与事件非常重要,都没有什么切身的体会,而这次通过做一个WinForm二次开发的项目才真正感觉到了委托与事件的犀利之处. 1.C#中的事件和委托的作用? 事件代表一个组件能够被关注 ...
- 简单的cookie盗取
此文需要有一定的javascript\html\php方面的只是作为基础 直接上代码: #用于抓取盗窃来的cookie的php文件,此文件需置于攻击者的服务器上,这里包含了两种写法:Method1和M ...
- 使用fill_n算法
今天使用这个算法来给一个数组赋值,所以把它的使用过程记录下来: fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val.把从起始点开始依次赋予count个元素val的值. 注意 ...
- 我也说说Emacs吧(1) - Emacs和Vi我们都学
好友幻神的<Emacs之魂>正在火热连载中,群里人起哄要给他捧捧场. 作为一个学习Emacs屡败屡战的用户,这个场还是值得捧一下的.至少我是买了HHKB键盘的... 从我的键盘说起 - 有 ...
- 那些年提交AppStore审核踩过的坑
此文刚刚上了CocoaChina的首页:那些年提交AppStore审核踩过的坑 欢迎围观,谢谢大家支持. //add by 云峰小罗,2016.08.04 做iOS开发近5年了,每次提交版本时不可谓 ...
- js之3D轮播图
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Eclipse web工程 部署 三种方式 2
Eclipse web工程 部署 三种方式 2.插件 tomcat插件下载: http://www.eclipsetotale.com/tomcatPlugin.html 解压缩后, com.sysd ...
- matlab GUI重新命名
http://www.mathworks.com/matlabcentral/newsreader/view_thread/309789 To change the name you should o ...