黑马程序员技术交流社区
标题:
[南京校区] servlet快速入门
[打印本页]
作者:
大蓝鲸小蟀锅
时间:
2018-4-14 10:10
标题:
[南京校区] servlet快速入门
servlet快速入门
1.什么是servlet
在server上运行的 用JAVA语言编写的一段小程序。
作用:接收到用户的请求,处理请求,把结果 以响应的 形式返回给client。
2.应用程序的体系结构
2.1 C/S 结构(Client/Server-DB)
Client:需要安装特定的软件,维护麻烦
界面修改: 只要安装的部分发生修改,都要重新升级 如果发生升级有可能就会带来相应的培训任务
2.2 B/S 结构(Browser/Server)
界面放到服务器,借助于浏览器遵循http协议。
客户端不需要安装特定的软件,客户端的维护量降低,如果view/service修改就直接在服务器上修改就行了。
移动端 一般都是C/S 企业级的应用开发一般都是B/S的
3.tomcat
tomcat是apache组织提供的开源web服务器。
www.apache.org
javaEE规范:开发者和server厂商 都必须遵循。
配置: 1)必须以来jdk的环境变量:JAVA_HONE jdk的安装根路径
2)http的端口,8080默认(如果安装oracle数据库会被占用,需要修改端口号)
修改端口:tomcat的安装根路径/conf/server.xml
<Connector port="8989" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
建议修改之前做备份:一个开发人员的良好习惯,修改之前做备份
启动:
双击 tomcat根目录-->bin-->startup.bat(window) startup.sh(linux)。
在黑窗口查看 1) 没异常信息
2) 找“信息: Starting Coyote HTTP/1.1 on http-8989” 启动成功 (8989是修改后的端口号)
3) 找“信息: Server startup in 393 ms” (启动时间)
注意:tomcat在同一个服务器上只能启动一次
4.servlet
在服务器上运行的java语言编写的小程序,用于接受client请求(一般包括url和用户的数据),
并且对 cilent的请求进行处理,把结果以响应的形式返回cilent。(如果返回IE应该是返回的标准的html)
4.1、写代码
1) implements Servlet 必须实现接口中的所有方法
2) extends GenericServlet(抽象类) 必须实现父类中的所有抽象方法(service方法)只有一个抽象方法
abstract void| service(ServletRequest req, ServletResponse res)
3) extends HttpServlet(也是抽象类,定义成抽象类是不让new对象) 覆盖父类的service方法
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{ //为什么会有io异常,servlet处理完后以流的形式返回 ServletException不是和协议相关的异常
//1、设置响应类型 服务器处理完成后以什么类型返回。和响应相关。
response.setContentType("text/html");
//2、获取输出流
PrintWriter out = response.getWriter();
//3、使用输出流
out.println("<html>");
out.println("<head><title>xxx</title></head>");
out.println("<body>");
Date date=new Date();
out.println("new"+date);
out.println("</body>");
out.println("</html>");
//out.close() servlet会自动调用所以不用手动关闭
out.flush(); //PrintWriter 是缓冲流 所以清除先缓冲就可以了
}
注意:在 JavaProject 中,必须导入 servlet-api.jar 。
把server上不能直接运行的类,变成可以通用IE直接访问的类。
web.xml (web应用的部署描述符文件)
<!-- 配置servlet-->
<servlet>
<servlet-name>别名,在同一个web应用中 唯一</servlet-name>
<servlet-class>指定servlet的全类名 包结构</servlet-class>
</servlet>
<!-- 配置servlet的映射-->
<servlet-mapping>
<servlet-name>别名,必须同servlet标签中的一致</servlet-name>
<url-pattern>访问servlet的url地址格式,必须以/开头</url-pattern>
</servlet-mapping>
5.乱码问题
解决响应内容中的中文乱码:
response.setCharacterEncoding("GBK");
响应设置编码格式: Response.setContentType("text/html,Charset=utf-8");
Response.setCharacterEncoding("utf-8");
请求设置编码格式: //post请求: Request.setCharacterEncoding("utf-8");
//get请求:
String parameter = Request.getParameter("name");
byte[] bytes = parameter.getBytes("iso-8859-1");
String name = new String(bytes, "utf-8");
6.servlet通讯
1、include 包含 在一个servlet中要包含另外一个servlet的结果。
应用场景:动态网页的 复用。同一个网站的每个页面的logo图片(可以每个页面都写一个img 但是修改麻烦)
步骤一:创建公共页面 LogoServlet
<img src="/web应用名/子目录/xx.gif"/>
步骤二:在其它页面中,包含公共页 (分清哪个是包含哪个是被包含)
//获取请求分发对象
RequestDispatcher rd = request.getRequestDispatcher("/url-pattern");
//包含
rd.include(request, response);
----------------------------------------------------
2、forward 请求转发【重点】
原则:显示(界面) 和 功能(逻辑) 分离。
步骤一:创建 功能Servlet (LoginAction)
// 1 获取client数据
// 2 调用业务类的方法,实现xx功能
// 3 根据结果,
如果跳转到html的路径:"/子目录/xx.html"
如果跳转到servlet
RequestDispatcher rd = request.getRequestDispatcher("/url-pattern");//获取请求转发对象 显式servlet的url-pattern
rd.forward(request, response);
步骤二:创建 显示Servlet (OkView ErrorView)
// 1设置响应类型
// 2获取输出流
// 3使用输出流
跳转的同时,共享数据,
在逻辑servlet中获取数据 在显式servlet中想使用 需要在逻辑servlet中添加servlet中添加如下代码。
往request中设置值(命名属性):
request.setAttribute(str, obj);
在显示Servlet中,获取requet中的命名属性:
Object obj = request.getAttribute(str);
forward(请求转发)的特点:
1) 服务器内部的跳转 (客户端不知道跳转)
2) 共享同一个request对象
3) 地址栏不变 (地址栏地址和内容不一致)
4) 永久转向
5) 只能转向同一web应用内资源
通常的编码规范:逻辑servlet LoginActionServlet
显式servlet LoginViewServlet
--------------------------------------------------------------
3、重定向 sendRedirect【重点】
是web开发中的 一种跳转方式。
response.sendRedirect("/web应用名/url-pattern");
response.sendRedirect("/web应用名/子目录/xx.html");
sendRedirect的特点:
1) client的跳转
2) 不共享 同一个request 对象
3) 地址栏改变
4) 永久跳转
5) 可以转向 站外 资源
forward 和 sendRedirect的应用场景:
1) 功能Servlet中的数据 转到 显示Servlet后,还需要使用时,必须使用 forward;
2) 除此以外,sendRedirect 优先。
7常见问题
7.1、404 请求资源无效
原因: 1) url地址栏写错,重点检查 web应用名 和 url-pattern
2) web应用没部署
3) 检查tomcat启动界面是否有异常(标签错误、配置中的全类名等等)
404是服务器执行完客户端的请求以后,返回给客户端的一个关于执行结果的状态编码
产生的原因:web服务器(容器)根据请求地址找不到对应资源,如:
1).输入的地址有误(应用名大小写不正确,名称拼写不正确)。
2).web.xml文件中<servlet>和<servlet-mapping>中的两个<servlet-name>不一致。
3).没有将工程部署到Tomcat的webapps下面。
4).web工程部署时的结构没有遵循Servlet规范。
7.2、405
405这个错误的产生原因是容器找不到Servlet方法来处理请求。
1).service方法名写错,字母顺序不对或大小写错误。
2).Service方法参数类型与标准不一致,或参数顺序与标准不一致。一定是HttpServletRequest,然后是HttpServletResponse类型。
3).Service方法异常、返回值类型与标准不一致,一定是抛出ServletException、IOException.返回值类型是void。
7.3、500
原因:1) serlvet的源代码中出异常;
2) 检查servlet类在server上的路径和包结构是否正确。
500的错误是请求的Servlet在执行service方法的过程中出现了错误,程序不能继续运行了。
1).Servlet没有继承HttpServlet或实现Servlet接口
2).Web.xml文件中写错,与真正的包名类名不符。
3).Servlet方法中的代码运行时抛出异常
7.4、请求server后,IE没反应,提示"下载/另存为"
原因:检查 response.setContentType("text/html"); 通常写成test/html 。
(1).可能性一:text/html;charset=GBK中间分号写成逗号.
(2).可能性二:XML中配置信息出错.
(3).可能性三:如定义全局变量时,例:CONTENT_TYPED在以后所用中放在双引号之中.
(4).可能性四:当上面的text/html,charset中写错字符的时候,也会提示下载.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2