java之Servlet的基本使用

基本概念

Servlet指在服务器端执行的一段Java代码,可以接收用户的请求和返回给用户响应结果。

C/S架构。

Client和Server即客户端和服务器。
优点:一般来说由于客户端已经安装,所以不需要每次都加载页面元素,运行过程中只需要传输数据。并且客户端能够显示的动画效果更好,更完整。
缺点:必须要下载安装客户端,如果没有安装就不能运行,而一般的程序客户端都比较大,需要时间下载。对于系统的支持不能保证。

B/S架构。

Browser/Server即浏览器和服务器。
优点:无需下载客户端,也不用关心是什么系统,只有有浏览器的系统都可以使用。
缺点:能够操作的习惯必须遵循浏览器的习惯。动画等效果可能没有客户端那么流畅。

tomcat的安装和目录介绍

bin:tomcat软件中的一些可执行文件
conf:配置文件
lib:tomcat在运行过程中所需要的一些第三方库(jar包)。
logs:tomcat的日志文件
temp:临时文件
webapps:运行在tomcat中由程序员开发的一些项目
work:tomcat中执行一些JSP页面文件需要翻译和转译的一些临时文件

tomcat的启动命令:

在dos窗口切换到tomcat的bin目录,
1.输入catalina.bat run
作用是将tomcat以控制台的模式启动,会将所有的服务器运行过程中的System.out.print输出的信息输出到控制台,并且控制台不能关闭,一旦关闭,tomcat停止运行。
2.输入startup.bat
作用是启动tomcat,会另外开启一个控制台,当前命令行可以关闭。在其他系统(例如:Linux)中,不会开启一个新的控制台,只会在后台以服务的形式启动tomcat。

开发一个简单的服务器项目,在tomcat中运行:

1打开webapps,新建一个文件夹,起名为test(工程名)
2开发一个简单的html文件,放入到test文件夹中,命名为index.html,代码如下:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		
	</head>
	<body>
		<h1>千锋欢迎你</h1>
	</body>
</html>
3使用浏览器访问地址:http://ip地址(本机可以使用localhost):端口号/test,其他人也可以访问
4将静态页面改成动态页面,修改代码:
<%@page pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>		
	</head>
	<body>
		<%! int i = 1;%>
		<h1>千锋欢迎你,你是第<%= i++%>个访问页面的用户</h1>
	</body>
</html>
将页面的html后缀名改成jsp。再次访问原来的第三步的地址,可以看到会随着用户的刷新而数量变化。这是我们开发的第一个动态页面效果。

Eclipse中配置tomcat

步骤:
1. 在新建工程的地方右键选择新建->other,选择server
2. 选择Apache,选择tomcat8.0
3. 点击Browse按钮选择tomcat8.0的安装路径
4. 点击Finish
5. 打开server控制台,双击server的配置
6. 将tomcat工程路径配置到webapps中

开发一个简单的servlet程序

1新建一个web工程,选择server用tomcat8.0
2新建一个类HelloServlet,继承HttpServlet,重写doGet和doPost方法。
public class HelloServlet extends HttpServlet{
	// 处理页面表单的get请求
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		response.getWriter().print("<h1>Hello, world</h1>");
	}	
	// 处理页面表单的post请求
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		doGet(request, response);
	}
}
3配置HelloServlet的访问路径
<!-- 可以使用两种方式配置,一种是在web.xml中配置,在任意版本都可以使用-->
<!-- servlet的名称 -->
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.qianfeng.day21.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet的映射路径,一定以/开头 -->
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello.do</url-pattern>
</servlet-mapping>

<!-- 另一种是在HelloServlet中直接配置,但是两种配置方案只能使用一种-->
@WebServlet("/hello1.do") // 一定要以/开头,只能在web.xml中version=3.0或以上的版本才能使用
public class HelloServlet extends HttpServlet{
	//...省略中间的代码
}
4运行程序,在浏览器中输入所对应的路径
注意:
1. 路径中一定会包含工程名称。
2. 在重写doGet和doPost方法时,一定要删除通过super.去调用父类方法的代码。因为父类对应的方法中会直接抛出异常,提醒用户必须重写该方法。
3. 不要在方法中自己调用自己,容易构成死循环。
4. 可以配置多层路径,但是容易出现问题。建议现阶段路径就配置一层。

servlet的生命周期

生命周期是指对象从出生到消亡的过程。
创建:对象的创建,会调用构造方法。只是在第一次被访问的时候创建对象,后面都不会再创建,所以只会创建一个servlet对象。相当于单例。
初始化:对象创建完毕后,可能需要进行初始化的一些设置,初始化的方法为init。只是在第一次被访问的时候,在创建对象后紧接着进行初始化,只会执行一次。
服务:这是一个关键的周期,整个servlet的作用都在此体现,一般包含doGet和doPost两个方法。
销毁:destroy方法,作用是在servlet对象在销毁之前去关闭一些资源等。并不是使用此方法进行销毁当前对象。
@WebServlet("/hello.do") // 一定要以/开头
public class HelloServlet extends HttpServlet{
	// 初始化方法
	@Override
	public void init() throws ServletException {
		System.out.println("对象正在被初始化...");
	}
	
	// 构造方法
	public HelloServlet() {
		System.out.println("HelloServlet正在被创建");
	}
	
	
	// 处理页面表单的get请求
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		System.out.println("提供服务...");
		response.getWriter().print("<h1>Hello, world</h1>");
	}
	
	// 处理页面表单的post请求
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		doGet(request, response);
	}
	
	// 在对象销毁前关闭资源的方法
	@Override
	public void destroy() {
		System.out.println("HelloServlet将要被销毁,正在关闭资源...");
	}

简单示例,演示登录效果:创建index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
	<form action="login.do" method="get">
		<input type="text" name="username" placeholder="用户名"/><br/>
		<input type="password" name="pwd" placeholder="密码"/><br/>
		<input type="submit" value="登录"/>
	</form>
</body>
</html>

创建LoginServlet.java

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// request指请求对象
	// response指相应对象
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 接收请求参数
		String username = request.getParameter("username"); 
		String pwd = request.getParameter("pwd");
		
		// 得到响应输出页面对象
		// 设置页面显示中文
//		response.setCharacterEncoding("utf-8"); // 有时不起作用,不建议使用
		// 或者
		response.setContentType("text/html;charset=utf-8");  // 建议使用
		
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE html>");
		out.print("<html>");
		out.println("<head>");
		out.println("<meta charset=\"utf-8\" />");
		out.println("<title></title>");
		out.println("</head>");	
		out.println("<body>");	
			
		if(username.equals("zhangsan") && pwd.equals("123456")) {
			out.println("登录成功!");
		}else {
			out.println("登录失败!");
		}
		out.println("</body>");	
		out.println("</html>");	
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

页面跳转

每次都使用out.print()去输出复杂的html不方便,可以直接使用页面跳转的方式去跳转到新的页面。
页面跳转有两种方式:
第一种叫做重定向,相当于a链接,代码如下:
response.sendRedirect("success.html");
第二种叫做请求转发,代码如下:
request.getRequestDispatcher("success.html").forward(request, response);
两种方式的区别:
1. 请求转发页面地址不会改变,而重定向会改变地址。会影响页面上静态资源(图片,css,js,a等)路径。
2. 请求转发会传递请求参数,而重定向丢失所有请求和响应中的数据。

Get和Post方法区别

1. get提交到doGet方法处理,post提交给doPost处理。
2. get会将参数显示在地址栏,而post不会显示。
3. get相对不安全,post相对安全。
4. get传递的参数长度会有限制,post会长很多,基本没有太多的限制。
5. get不适用于文件上传,post适用于文件上传。
6. get适用于搜索引擎搜索,邮件发送信息,内容分享等,而post不适用
可以简单理解为,除了第6条需要使用get,其他可以都用post。读一般可以使用get,写一般使用post
// get转码方式
name = new String(name.getBytes("ISO8859-1"), "utf-8");
// post能够一次全部转码
request.setCharacterEncoding("utf-8");// 此代码一定要写在request.getParameter("")之前。

使用之前的数据库代码完成注册功能 reg.html

<body>
	<form action="reg.do" method="post">
		<input type="text" name="name" placeholder="姓名"/><br/>
		性别:<input type="radio" name="sex" value="0"/><input type="radio" name="sex" value="1"/><br/>
		年龄:<select name="age">
			<option value="18">18</option>
			<option value="19">19</option>
			<option value="20">20</option>
			<option value="21">21</option>
			<option value="22">22</option>
			<option value="23">23</option>
			<option value="24">24</option>
		</select><br/>
		<input type="text" name="address" placeholder="地址"/><br/>
		<input type="submit" value="注册"/>
	</form>
</body>

RegServlet.java

@WebServlet("/reg.do")
public class RegServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 页面提交数据之所以编码有问题,是因为tomcat默认页面表单提交参数使用的是ISO8859-1编码(ASCII)
		// 如果是post,可以直接一次将所有的字符集都转换
		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("name");
		// 将字符串解析成字节数组,然后根据utf-8组成规则变成utf-8字符,但是这种方式需要一个一个的转,比较麻烦,适用于get表单
//		name = new String(name.getBytes("ISO8859-1"), "utf-8");
		String sex = request.getParameter("sex");
		String age = request.getParameter("age");
		int nage = 0;
		try {
			nage = Integer.parseInt(age);
		}catch(Exception e) {
			nage = 18;
		}
		String address = request.getParameter("address");
		Student stu = new Student(0, name, sex, nage, address);
		if(StudentDAO.insert(stu)) {
			response.sendRedirect("html/success.html");
		}else {
			response.sendRedirect("html/fail.html");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值