eclipse 运行时 tomcat是被载入
具体是在新建项目时被载入的
因此不需要自己开启tomcat
所以如果自己开启tomcat 端口就被占据了 eclipse就无法访问了
当然 eclipse如果一个程序占据端口 再开启其他程序也会导致无法访问
eclipse也可直接开启tomcat 然后再根据路径用浏览器就可以了
——————————————————————————————————————————
php是脚本 所以不需要编译 只要有服务器(解释php)然后直接用浏览器访问就可以了
但是java需要编译
所以在不使用集成开发环境的情况下
用命令行 javac xxxx.java生成 .class文件
然后开启tomcat 将.class放到对应的 tomcat路径 如我的 /usr/lib/tomcat/webapps........
一般在 webapps目录下 继续建立 webapps->web应用名(如ch1)->WEB-INF->classes
xml文件(部署描述文件)放到WEB-INF 编译出的class文件放到classes里面
然后浏览器根据相应的路径访问就可以了
注意要根据xml里面的url-pattern
<servlet-name>Chapter Servlet</servlet-name>
<url-pattern>/serv1 </url-pattern>
url http://localhost:8080/ch1/serv1
——————————————————————————————————————————
eclipse自己运行 tomcat的时候,8080端口对应的访问路径 也会编程workspace
servlet 和jsp虽然一个看上去像html一个像普通的java 但其实并不是
sevlet中如果直接输出 html会非常复杂并且出现相当多的问题
所以用jsp来存入html代码和和部分java代码 html中引入java(等同于php中的渲染模板)代码就是jsp
servlet中则是大部分java代码和部分html
容器(tomcat)接受请求会自己创建新的java线程
容器也是将jsp代码翻译成java的
也不需要去新建socket 监听之类,不需要担心服务器与servlet之间的api
只需在servlet里实现业务逻辑
1客户请求某servlet
2容器收到请求 建立HttpServletRequest HttpServletResponse请求和相应两个对象
3.找到servlet 分配一个线程,请求和相应对象分配给servlet
4.servlet根据请求不同 调用doGet 或 doPost
5.doGet 或 doPost生成动态页面 填入相应对象
6.进程结束 容器将相应对象转换成http相应 发回给客户,删除请求和相应对象
servlet可以有三个名字 1.客户知道的url名 (虚构的)
2.部署用
3.实际的文件名 取决于服务器的路径 包类..
在部署文件(xml文件)中会有具体的使用
<web-app>
<servlet>//内部映射
<servlet-name> aaa</servlet-name> //<servlet-name> 是部署名 只在部署文件使用
<servlet-class> foo.servlet1 </servlet-class>类的完全限定名 但是不要加class foo是包
</servlet>
<servlet>
<servlet-name> bbb</servlet-name> //<servlet-name> 是部署名 只在部署文件使用
<servlet-class> foo.servlet2 </servlet-class>类的完全限定名 但是不要加class foo是包
</servlet>
<servlet-mapping>//映射到公共
<servlet-name> aaa</servlet-name> //<servlet-name> 是部署名 只在部署文件使用
<url-pattern>/test1</url-pattern>//客户看到的 虚拟名
</servlet-mapping>
<servlet-mapping>//映射到公共
<servlet-name> bbb</servlet-name> //<servlet-name> 是部署名 只在部署文件使用
<url-pattern>/test2</url-pattern>//客户看到的 虚拟名
</servlet-mapping>
</web-app>
————————————————————————————————————
eclipse路径
1src里为 servlet(控制器)和 模型存放的地方,里面具体的的路径由包决定 而模型与控制器肯定是在不同包内的 model / web
2build里为 编译出的class文件 也同样按照上面的包路径决定具体路径
3.webcontent 里直接放jsp或html xml部署文件放在 web-inf里(固定的,必须的)
servlet(控制器 import model 例:import com.example.model.*;
然后在servlet里新建 某model里的类 然后调用模型类的方法
然后根据 (应用名/servlet别名)就可以映射到类文件
容器根据部署文件xml得到加载类 开始一个线程 将请求传递给servlet的service方法
————————————————————————————————————————————————————————————————————————————
服务器只创建每个servlet的单一实例,每个用户请求创建一个新的线程
首次创建servlet 会初始化init方法。
service方法:服务器每次接受对servlet请求创建一个新的线程,调用service方法,service方法检查http请求类型(get,post,put,delete等)相应的调用 doGet doPost等(其他不重要)方法。
servlet销毁:服务器绝定移除之前载入的servlet实例(管理员要求,长时间空闲)
移除servlet之前 调用destroy方法。
和php脚本不一样,servlet被创建之后是很多人使用。然后每个用户创建新线程。
如果新的请求到来,前面的还在执行就会并发发文。因此一些数据的同步要注意,局部变量则不需要。
implements SingleThreadModel这个接口 就会阻止多线程(不好)
处理多线程公共数据最好使用synchronized关键字
httpservlet的method手册,其他都和普通java差不多
还有一些服务器上的问题再具体查https://docs.oracle.com/javaee/7/api/toc.htm
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpServletRequest继承了 public interface HttpServletRequest extends ServletRequest
所以HttpServletRequest有
//http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html
//http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html
接收请求的参数编码
案例代码 pdf 329
pdf352
localhost:8080 not found http://blog.sina.com.cn/s/blog_8020e41101014lvu.html
路径http://www.cnblogs.com/chinafine/archive/2010/06/13/1757514.html