新建maven后 有错误提示
(1)点击Deployment Descriptor:servlet,然后点击Generate
Deployment Descriptor Stub
(2)配置环境变量:选择项目,右键properties
弹出框里选择Targeted Runtimes
在右侧勾选Apache Tomcat
Apply
Tomcat配置2、点击菜单栏的“Window”,然后选择“Preferences”。
3、点击弹出窗口的“Server”,然后选择“Runtime Environment”,然后点击右边的“Add”按钮。
4、选择弹出窗口上的“Apache”,然后选择Tomcat版本,然后单击“Next”。
5、选择Tomcat的安装根目录,点击“Finish”即可。
打开Services窗口,如果已经打开了,就不用打开,如果没有就Window -> Show View -> Servers
然后可以看到你配置的tomcat , 双击Tomcate Service
会出来一个Tomcate配置的视图 ,
在Service Location 下面选择User Tomcate installacion(默认选择的是第一个)
然后Save path 选择你的tomcat安装路径 , Deploy path选择你准备把项目放到哪个文件夹下最好为webapps
如果双击后,发现service location无法配置,需要移除与Tomcat服务器关联的项目,同时,鼠标右键菜单Clean清除Tomcat服务器的状态^^就可以修改了。
然后crlt + s 保存 。重新部署就Ok了
。
Servlet开发
静态网页
动态网页
servlet:服务器保存一个组件,动态给每一个用户拼一个网页
java里面称之为servlet
servlet特点:
服务器端组件
满足Sun的规范
可以动态拼资源
servlet是Sun推出的用于服务器端处理http协议的组件
服务器
java服务器
web服务器
java web服务器
servlet容器
Tomcat()
Jboss
weblogic
websphere
开发servlet
(1)编写servlet
(2)创建package
(3)创建 类,名为XXXServlet
(4)继承HttpServlet,从而间接实现了servlet接口
重写父类的service()
Web.xml下:
配置Servlet
先声明类,并给他取别名
再通过别名引用此类,给他取一个访问路径
部署(拷贝)
在Servers视图下,选择Tomcat 右键点击Add and Remove
在弹出框内将左边的待部署的项目选中
访问:
在浏览器输入http://localhost:8080/项目名/网名
常见错误:
404:找不到资源,一般情况路径不对
500:类名有误,Service()方法内的代码自身有误
405:方法声明有误
http协议:就是一个规范(W3C)
规定了浏览器和服务器如何通信以及通信的规则(数据格式)
如何通信
(1)建立连接
(2)发送请求
(3)接受响应
(4)断开连接
一次请求一次连接,减低服务器的压力
数据格式
(1)请求数据
请求行:请求的基本信息
消息头:请求数据的描述
实体内容:具体的业务数据
(2)响应数据
状态行:响应的基本信息
消息头:响应数据的描述
实体内容:具体返回的数据
对开发者的要求
(1)不需要开发者处理的地方
浏览器自动打包请求数据
浏览器自动发送请求数据
服务器自动打包响应数据
服务器自动发送响应数据
(2)需要开发者处理的地方
提供具体的请求中的业务数据
提供具体的响应中的返回数据
通过request处理请求数据,通过response处理响应数据
开发者会使用request和response的使用
1,完整路径:http://localhost:8080/servlet2/reg
2,绝对路径:
格式:/项目名/网名
实例:/servlet/reg
3,相对路径(要求掌握)
只需写出目标和当前页面的相对位置
当前页面的路径:/servlet2/register.html
访问目标:/servlet2/reg
二者是平级关系,相对路径为reg
注意:相对路径不能以“/”开头
请求方式:浏览器向服务器发送数据的方式
需要掌握众多方式中的两种:GET和POST
GET:采用请求路径传参数:
参数在传输过程中可见,导致隐私差
路径可以容纳的数据有限
但所有的请求默认都是GET请求
POST:采用实体内容传参
参数在传递过程中不可见,隐私性好
实体内容专门用来传数据,大小没有限制
在form上加method="post"默认是GET请求的
观察GET和POST请求
在浏览器f12,看NetWork选项
返回乱码问题解决:
1:get/post
将乱码后的字符串按照ISO编码还原成byte,
再将byte按照UTF-8编码转换为字符串
优点:万能 缺点:麻烦
2:get有效
修改Tomcat配置文件(servlet.xml)第65行加上
URIEncoding="utf-8"
3:post有效
再接受参数之前加上
req.setCharaterEncoding("utf-8")
声明实体内容的编码为utf-8
实体类(entity,po,vo...)
javaBean
满足如下规范的类
(1)在包下
(2)有默认构造器
(3)实现序列化接口
(4)有get/set方法(可选)
当前是查询页面:/EmpManager/findEmp
目标是增加页面:/EmpManager/add_emp.html
相对路径是:add_emp.html
重定向:
1:经典使用场景:解决两个网站之间的跳转问题
2:后来也用来一个网站内2个独立组件之间的跳转
一般增加,修改,删除后重定向到查询
两个独立组件之间不要直接调用,为了降低耦合度
源代码(workspace)
EmpManager
src
main
java
resource
webapp
WEB-INF
web.xml
test
target
classes
test-classes
保存时,自动编译
部署代码(Tomcat)
所谓的访问路径都是针对部署代码而言
1:静态资源(HTML/IMG/CSS/JS等)就是在Tomcat内存放的位置
2:动态资源(Servlet)
访问路径就是web.xml中声明的网名
建议:将访问路径理解为一个资源的名字(兰州拉面不一定只有兰州有)
System.out.println(req.getContextPath());
System.out.println(req.getServletPath());
System.out.println(req.getRequestURI());
System.out.println(req.getRequestURL());
输出:
/servlet3
/abc
/servlet3/abc
http://localhost:8080/servlet3/abc
URI和URL区别
(1)狭义的理解
只在java中理解URI和URL
URI:绝对路径
URL:完整路径
从表面上看URI包含了URL
(2)广义的理解
在任意的WEB项目中理解URI和URL
URI:资源的名称
URL:资源的真名
URI包含了URL
如何配置Servlet访问路径
(1)精确匹配
举例:/abc
只有/abc才能访问此Servlet
此Servlet只能处理这一个请求
适合规模很小的项目
(2)通配符
举例:/*
所有路径都能访问此Servlet
此Servlet能处理所有的请求
适合一个项目只写一个Servlet
(3)后缀
注意:不能以斜线开头
举例:*.XX
表示所有以XX为后缀的请求都能访问此Servlet
此Servlet能处理多个请求
适合一个项目写少量的几个Servlet
public class MainServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//获取请求路径:
String path=req.getServletPath();
//根据规范处理路径
if("/findEmp.do".equals(path)){
findEmp(req, res);
}else if ("/addEmp.do".equals(path)) {
addEmp(req, res);
}else {
throw new RuntimeException("查无此页");//该异常抛给服务器,服务器统一处理
}
}
protected void findEmp(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//1.接收参数(没有)
//2.处理业务(查询)
EmpDao dao=new EmpDaoImpl();
List<Emp> list=dao.findAll();
//3.输出响应(表格)
res.setContentType("text/html;charset=utf-8");
PrintWriter out=res.getWriter();
out.println("<a href='add_emp.html'>增加</a>");
//为了格式,方便检查
out.println("<table border='1' cellspacing='0' width='40%'>");
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 {
String ename=req.getParameter("ename");
String job=req.getParameter("job");
String sal=req.getParameter("sal");
Emp e=new Emp();
e.setEname(sal);
if(sal!=null&&sal.equals(sal)){
e.setSal(new Double(sal));
}
e.setEname(ename);
if(ename!=null){
e.setEname(ename);
}
e.setJob(job);
if(job!=null){
e.setJob(job);
}
//重定向访问的目标:/EmpManager/findEmp
res.sendRedirect("findEmp.do");//相对路径
}
}
Servlet特性:
(1):默认首次访问servlet时Tomcat会实例化它
(2)可以改为启动Tomcat时就实例化servlet(在web.xml中添加<load-on-startup>1</load-on-startup>,中间数字是加载的顺序)
(3)第1,2,4步只执行一次,所以servlet是单例的
(4)第3步执行多次,每个处理请求都执行
(5)意义:当需要规定在什么时刻做什么处理时,开发者知道在哪个方法内写代码
(6)
重写父类方法,super.XX一般别删,但是重写service需要删除
ServletConfig和ServletContext
作用:
区别:
(1)config:与Servlet是1对1的关系,Tomcat在初始化每个Servlet前会给他创建一个config,在调用init()前创建一个config,如果单独给某个servlet预置数据,使用config
(2)Context:与Servlet是1对n的关系,Tomcat在启动时创建唯一的context,多个servlet共用一份预置数据
应用:
(1)Config
假设要开发一个网页游戏
当用户数超出最大在线人数时需要排队
登录时判断是否已达到最大人数
登录:LoginServlet
最大人数:maxOnline(可变),可以配置,maxOnline只给LoginServlet使用
Web.xml下:
<init-param>
<!-- 给此Servlet预置参数 -->
<param-name>maxOnline</param-name>
<param-value>3000</param-value>
</init-param>
(2)context
软件内有很多查询功能,都带有分页功能
每页显示的行数size时常量,并且可配置,而且在多个查询功能之间所共用
<!-- 在标签外配置的参数是个所有Servlet共用的,他们都可以通过context读取该参数 -->
<context-param>
<param-name>size</param-name>
<param-value>20</param-value>
</context-param>
/*
* tomcat启动时就会创建唯一的context
* 并且会调用他的方法加载web.xml 中的公共参数
* context时全局的,任何servlet都可以使用
* */
//Tomcat创建servlet的逻辑:
//LoginServlet s=new LoginServlet();
//ServletConfig c=new ServletConfig();
//s.init(c)
Context的特殊用法
前提:之前使用config和context读取的都是常量
而context还有能力读写变量,可以被所有Servlet所共用
setAttribute()/getAttribute
想开发流量统计的功能,无论访问哪个功能,流量+1
由于流量是变量,并且在多功能间调用
总结:当需要给servlet预置参数时使用这样的对象
若参数只给一个servlet使用,使用config
若参数给多个servlet使用时,使用context
蓝色:接口 红色:类
快捷键ctr+T查看所选中的类
快捷键ctr+shift+t 查找类