使用servlet做一个最简单的微型网站demo,不建议任何人观看(一)

使用servlet做一个最简单的微型网站demo,不建议任何人观看

写下这篇博客主要还是为了梳理一下前期学习基础不牢固的相关知识,给自己做个回顾。
java语言 首先网站部署在tomcat上,使用maven进行了配置。
一个网站主要包括几个部分,前端登录界面,后端使用servlet和相关文件进行请求处理和回复,后续业务逻辑所处理数据库中的信息进行连接并返回到其他前端界面。目前学习过程中最重要的是几个servlet类的使用方法。
前端使用表单进行登录及相关数据提交,在这里主要是为了演示网站相关功能,并没有实际作用,只起到传递请求和参数的作用。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册界面</title>
</head>
<body>

	<form action="ret" method="post">//这一行是比较重要的,action决定了所使用servlet的位置或者说urlpattern,稍后会提到,method则是指出所使用的传递方式。
		<p>
			账号:<input type="text" name="username" />//input是输入框
		</p>
		<p>
			密码:<input type="password" name="pwd" />
		</p>
		<p>
			性别: <input type="radio" name="sex" value=1 />男 <input type="radio"
				name="sex" value=0 />女
		</p>
		<p>
			兴趣: <input type="checkbox" name="interest" value="sports" />运动 <input  //checkbox是多选框
				type="checkbox" name="interest" value=read />阅读 <input
				type="checkbox" name="interest" value=movie />电影
		</p>
		<p>
			注册:<input type="submit" value="注册" >
		</p>
	</form>
</body>
</html>

form action=“ret” method="post"这一行是比较重要的,action决定了所使用servlet的位置或者说urlpattern,稍后会提到。而method则是指出所使用的传递方式,表单通常是使用post传递。这是有get和post两个方法的特性决定的。

getpost
采用请求路径进行传参采用实体进行传参
参数传递是可见的,不安全参数传递不可见,安全性好,但可用f12中network看到信息
地址长度有限,2k以内大小无限制
默认请求使用get需注明

另外在这里选择get或post会影响到浏览器访问的servlet接收信息所使用的方法,相应的影响到了所需重写的方法。使用post传递,接收就是doPost,使用get传递,接收就是doGet。

package web;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.text.html.HTML;

public class reg extends HttpServlet {

	/**
	 * @author hhf
	 * @see name@ this class is design to help a man who need the way to his wanted.
	 */

	@Override
	public void service(HttpServletRequest req, HttpServletResponse res) throws IOException {

//处理请求的一般步骤是:1.接受参数2.处理业务3.发送响应
		// 接受参数其中parameter是单个值,而getparametervalues是多个值。
		req.setCharacterEncoding("utf-8");//设置接收值的解码类型
		String username = req.getParameter("username");//接收相关参数
		String password = req.getParameter("password");
		String sex = req.getParameter("sex");
		String[] interest = req.getParameterValues("interest");
		Cookie nameCookie = new Cookie("name", username);//使用cookie进行数据信息传递
		res.addCookie(nameCookie);//将创建的cookie返回到浏览器端
		System.out.print(username + ":das");
		if (interest != null) {
			for (String i : interest) {
				System.out.print(i);
			}
		}
		// res.setCharacterEncoding("utf-8");//进行输出的相关方法如下
		// res.setContentType("text/html");//必须是这样的格式,不能任何变化
		// PrintWriter outPrintWriter = res.getWriter();
		// outPrintWriter.printf(username+" <p>你好,世界</p>");
		// outPrintWriter.close();
		res.sendRedirect("res");// 重定向跳转到指定的网页或者其他servlet等文件
	

	}

}

在上面的html代码中可以看到没有使用绝对路径或者相对路径,而是使用ret就可以访问下面的servlet,这是使用了部署描述符实现的。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>servlet2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>regs</servlet-name><!-- 要定义新的完整的类名 反射-->
    <servlet-class>web.reg</servlet-class><!-- 要指定该类名所指向的文件 反射-->
  </servlet>
  <servlet-mapping>
    <servlet-name>regs</servlet-name><!-- 保持与上述名称不变-->
    <url-pattern>/ret</url-pattern><!-- 设定路径名为ret,所以当在本项目中访问ret就是访问到这里-->
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>res</display-name>
    <servlet-name>res</servlet-name>
    <servlet-class>web.res</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>res</servlet-name>
    <url-pattern>/res</url-pattern>
  </servlet-mapping>
</web-app>

其实根本不用这么麻烦,直接在servlet文件开头使用注解@WebServlet(name = “ShoppingCartServlet”, urlPatterns = { “/products”, “/viewProductDetails”, “/addToCart”, “/viewCart” })即可指定索要访问的文件路径名。

但是由于http是一个无连接协议,就引入了一个重要的命题,如何保存用户状态,因为一个用户登录后就应当以当前身份访问所有用户,因此引入了状态保存,或者说是会话管理。其中主要使用了大名鼎鼎的cookie和session,cookie是保存于用户端的,而session是保存于服务器内存及交换文件中的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
package com.xr.util; import java.lang.reflect.Method; import java.sql.*; import java.util.*; import org.junit.Test; import com.xr.dto.ManagerDTO; public class DBHelper { private Connection conn = null; { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out.println("创建驱动失败"); e.printStackTrace(); } try { conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/xc","root", "root"); } catch (SQLException e) { System.out.println("创建连接失败"); e.printStackTrace(); } } // 单表新增,修改,删除 public boolean excuteUpdate(String sql) { if (conn == null) return false; boolean sign = false; try { Statement stat = conn.createStatement(); int i = stat.executeUpdate(sql); if (i > 0) { sign = true; } else { sign = false; } } catch (Exception ex) { ex.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { } return sign; } } // 多表新增,修改,删除 public boolean excuteUpdate(Object... sql) { if (conn == null) return false; boolean sign = false; try { conn.setAutoCommit(false); Statement stat = conn.createStatement(); for (Object o : sql) { stat.addBatch(o.toString()); } stat.executeBatch(); conn.commit(); sign = true; } catch (Exception ex) { conn.rollback(); sign = false; ex.printStackTrace(); } finally { try { conn.setAutoCommit(true); conn.close(); } catch (SQLException e) { } return sign; } } @Test public void tet() throws SQLException{ List list=(List) conn.createStatement().executeQuery("select name from tbl_manager where B_id='1'"); ManagerDTO m=(ManagerDTO) list.get(0); System.out.println("aaaaaaa"+m.getName()); } // 单表查询 public List excuteQuery(String sql, String objName) { if (conn == null) return null; List list = new ArrayList(); try { Statement stat = conn.createStatement(); ResultSet re = stat.executeQuery(sql); Class c = Class.forName(objName); Method[] ms = c.getDeclaredMethods(); ResultSetMetaData rsmd=re.getMetaData(); while (re.next()) { Object obj = c.newInstance(); for (int i = 0; i < ms.length; i++) { Method m = ms[i]; if (m.getName().startsWith("set")) { String name = m.getName().substring(3); for(int j=1;j<=rsmd.getColumnCount();j++){ if(name.equalsIgnoreCase(rsmd.getColumnName(j))){ m.invoke(obj, re.getString(name)==null?"":re.getString(name)); break; } } } } list.add(obj); } } catch (Exception ex) { list = null; ex.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { } return list; } } /*标量结果*/ public Object executeScare(String sql){ if (conn == null) return null; Object obj = null; try { Statement stat = conn.createStatement(); ResultSet re = stat.executeQuery(sql); if (re.next()) { obj=re.getString(1); } } catch (Exception ex) { ex.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { } return obj; } } // 单个对象的查询 public Object excuteOneQuery(String sql, String objName) { if (conn == null) return null; Object obj = null; try { Statement stat = conn.createStatement(); ResultSet re = stat.executeQuery(sql); Class c = Class.forName(objName); Method[] ms = c.getDeclaredMethods(); ResultSetMetaData rsmd = re.getMetaData(); if (re.next()) { obj = c.newInstance(); for (int i = 0; i < ms.length; i++) { Method m = ms[i]; if (m.getName().startsWith("set")) { String name = m.getName().substring(3); for(int j=1;j<=rsmd.getColumnCount();j++){ if(name.equalsIgnoreCase(rsmd.getColumnName(j))){ m.invoke(obj, re.getString(name)==null?"":re.getString(name)); break; } } } } } } catch (Exception ex) { ex.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { } return obj; } } // 多表查询 public List excuteQuery(String sql) { if (conn == null) return null; List list = new ArrayList(); try { Statement stat = conn.createStatement(); ResultSet re = stat.executeQuery(sql); ResultSetMetaData remd = re.getMetaData(); while (re.next()) { List row = new ArrayList(); for (int i = 1; i < remd.getColumnCount() + 1; i++) { row.add(re.getString(i)==null?"":re.getString(i)); } list.add(row); } } catch (Exception ex) { ex.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { } return list; } } // 多表查询,单条记录返回 public List excuteOneQuery(String sql) { if (conn == null) return null; List row = new ArrayList(); try { Statement stat = conn.createStatement(); ResultSet re = stat.executeQuery(sql); ResultSetMetaData remd = re.getMetaData(); if (re.next()) { for (int i = 1; i < remd.getColumnCount() + 1; i++) { row.add(re.getString(i)); } } } catch (Exception ex) { ex.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { } return row; } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值