简介
一
Web工程结构
实例1
FirstServlet.java
package com.servlet;
public class FirstServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 接受请求发来的参数
String name = request.getParameter("name");
String html = "<h1 style = ' color red '>hi,"+ name +"!</h1><hr/>";
PrintWriter out = response.getWriter();//从服务器到浏览器返回的输出流
System.out.println("返回给浏览器的响应数据为:"+html);
out.println(html);//将html发回浏览器
}
}
xml:
<?xml version="1.0" encoding="UTF-8"?>
<display-name>FirstServlet</display-name>
<welcome-file-list> ... </welcome-file-list>
<!-- 声明Servlet -->
<servlet>
<!-- servlet的别名 -->
<servlet-name>first</servlet-name>
<servlet-class>com.servlet.FirstServlet</servlet-class>
</servlet>
<!-- 将Servlet与URL绑定 -->
<!-- http://localhost:8080/FirstServlet/hi?name=XXX -->
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
</web-app>
图解
浏览器中输入信息,通过请求给TC,TC查看url去xml中匹配,匹配到后查找,再创建FirstServlet对象,执行service方法,提供响应和支持
out后,TC通过响应给浏览器,执行结果。
Servlet开发
步骤:
1.创建Servlet类,继承HttpServlet
2.重写service方法,编写程序代码
3.配置web.xml,绑定URL
Servlet访问方法
- http://IP地址:端口/context-path/url-mapping
- 远程访问使用IP地址,本地访问localhost(127.0.0.1)
- context-path成为“上下文路径”,默认为工程名
实例2
SampleServlet.java
package com.servlet;
public class SampleServlet extends HttpServlet {
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();//向浏览器输出的数据流
out.println("<a href='http://www.baidu.com'>Baidu</a>");
}
}
xml:
<servlet>
<servlet-name>sample</servlet-name>
<servlet-class>com.servlet.SampleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sample</servlet-name>
<!-- 映射到sample地址上 -->
<url-pattern>/sample</url-pattern>
</servlet-mapping>
访问使用:
http://localhost:8080/FirstServlet/sample
http://127.0.0.1:8080/FirstServlet/sample
请求参数
请求参数是指浏览器通过请求向Tomcat提交的数据。通常是用户输入的数据,待Servlet进行处理;
格式:参数名1=值1&参数名2=值2&参数名n=...
表单中action属性
<form action="http://127.0.0.1:8080/FirstServlet/sample" >
Servlet接收请求参数
request.getParameter()
–接收单个参数
request.getParameterValues()
–接收多个同名参数
Get Post 请求方法
Get方式是将数据通过在URL附加数据显性向服务器发送数据。. http://localhost:8080/FirstServlet/sample?name=zhangsan
Post方式会将数据存放在”请求体”中隐性向服务器发送数据. http://localhost:8080/FirstServlet/sample
·请求体: name=zhangsan
这两个方法比较而言,Get方法可读性更好,Post方法数据更加的隐秘
public class RequestMethodServlet extends HttpServlet{
//处理get请求
public void doGet(HttpServletRequest request , HttpServletResponse response) throws IOException{
String name = request.getParameter("name");
response.getWriter().println("<h1 style='color:green'>" + name + "</h1>");
}
//处理post请求
public void doPost(HttpServletRequest request , HttpServletResponse response) throws IOException{
String name = request.getParameter("name");
response.getWriter().println("<h1 style='color:red'>" + name + "</h1>");
}
}
三种方法
service() 对所有请求都无差别处理
Get请求 doGet()
Post请求 doPost()
Get与Post应用场景
Get常用于不包含敏感信息的查询功能
例如:https://www.baidu.com/s?wd=yumao&rsv_ spt=1
Post用于安全性要求较高的功能或者服务器的”写"操作
1.用户登录 2.用户注册 3.更新公司账目
Servlet生命周期
Servlet被服务器实例化后,调用 init () 方法进行初始化,请求到达后调用service() 方法来处理客户端的请求。service方法自动派遣运行与请求对应的doXXX方法,直到服务器决定销毁实例调用 destroy() 方法终止(结束)。
- 装载 - web.xml
- 创建 - 构造函数
- 初始化 - init()
- 提供服务 - service()
- 销毁 - destroy()
//servlet生命周期,的三个方法,1.被创建,执行且只执行一次init方法,2.提供服务,执行service方法,执行多次 3.被销毁,当Servlet服务器正常关闭时,执行destroy方法,只执行一次。
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(req, resp);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
}
注释配置Servlet
- Servlet 3.x之后引入了"注解Annotation" 特性
- 注解用于简化Web应用程序的配置过程
- Servlet核心注解:
@WebServlet
/*写了注解@WebServlet(映射URL) 之后就不用切换去写web.xml里面的东西了
*因为有了这句话之后,在启动的时候,Tomcat会扫描所有的字节码文件,这个类里面写了@WebServlet并且配置了
* 对应的URL,就会按照这个规则加载进去,其实@WebServlet就像是一个标志,告诉Tomcat当前的类是一个Servlet,
* 要将它绑定到/anno就可以了
*/
@WebServlet("/anno")//即url
public class AnnotationServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("I'm annotationServlet servlet!");
}
}
JSP
Servlet的缺点
- 静态HTML与动态Java代码混合在一起,难以维护
- Servlet利用out.println()语句输出,开发效率低下
- Eclipse很难在开发过程中发现错误,调试困难
JSP介绍
- JSP全称是(Java Server Pages),Java服务器
- JSP是J2EE的功能模块,由Web服务器执行
- JSP的作用就是降低动态网页开发难度
JSP的运行要求
- 可正常运行的Tomcat
- 所有JSP页面扩展名必须是.jsp
- JSP页面应放在Web应用程序目录下
实例三
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
<tr>
<th>year</th>
<th>salary</th>
</tr>
<%
for(int i = 0 ;i<=50; i++){
out.println("<tr>");
out.println("<td>" + i + "</td>");
int sal = 0;
if(i<=5){
sal = 1500 + i * 150;
}else if(i>5 && i<=10){
sal = 1500 + 150 * 5 + (i-5) * 300;
}else if(i>10){
sal = 1500 + 150 * 5 + 5 * 300 + (i-10)*375 ;
}
out.println("<td>"+sal+"</td>");
out.println("</tr>");
}
%>
</table>
</body>
</html>
JSP的执行过程
JSP的转译过程
JSP的基本语法
JSP语法十分简单,按功能可分为以下四种
1.JSP代码块
2.JSP声明构造块
3.JSP输出指令
4.JSP处理指令
JSP代码块
JSP代码块用于在JSP中嵌入Java代码
JSP代码块语法:<%java代码%>
例如:
<%System.out.println("Hello World!");%>
JSP声明构造块
JSP声明构造块用于声明变量或方法
JSP声明构造块语法:<%!声明语句%>
mooc
例如:
<%! public int add(int a,int b){return a+b;} %>
JSP输出指令
JSP输出指令用于在JSP页面中显示java代码执行结果JSP输出指令语法:<%=java代码%>
例如:
<%="<b>" + name +"</b>"%>
JSP常用处理指令
<%@ page %>
定义当前JSP页面全局设置
<%@include%>
将其他JSP页面与当前JSP页面合并
<%@taglib%>
引入JSP标签库
JSP中注释的区别
<%-- 注释 --%>
JSP注释,被注释语句不做任何处理
//
、/*… */
用于注释<%%>java代码,被注释代码不执行
<!--html-->
HTML注释,被注释的语句不会被浏览器解释
实例四
综合训练:质数算法
列出1000内的质数(除1以外,只能被1和自身整除的自然数)
要求1:使用List保存所有有效的质数
要求2:将结果打印到页面,格式为“<h1>X是质数</h1>
"
<%@page import = "java.util.*,java.text.*" contentType="text/html;charset=utf-8" %>
<%!
boolean isPrime(int num){ //抽象方法 定义写在%!
boolean flag = true;
for(int j=2 ; j < num ; j++){
if(num % j == 0){
flag = false;
break;
}
}
return flag;
}
%>
<%
//泛型便于使用 包装对象integer
List<Integer> primes = new ArrayList();//用指令导入包
for(int i = 2 ;i<=1000; i++){
boolean flag = isPrime(i);
if(flag == true){
//out.println("<h1>"+i+"</h1>");
primes.add(i);
}
}
%>
<%
<%
for(int p : primes){
//out.println("<h1>"+p+"是质数</h1>");//当为html代码 利用输出语句
%>
<h1 style = 'color:red'><%=p %>是质数 </h1>
<%
}
%>