目录
Java基础
Web前端:
页面结构:html
Servlet、jsp(Java Server Page)=html+java
页面样式:css(Cascading Style Sheet,层叠样式表)
页面交互:js(javascript)、jQuery、AJAX
XML文件
MySQL数据库
JDBC(Java DataBase Connectivty)
JavaWeb项目:
一、反射机制:
在程序运行期间能够动态创建对象,获取对象的属性。
User user = new User();
1.1 反射机制创建对象:
public class Reflect01 { /** * 利用反射机制动态创建对象 */ public static void main(String[] args) throws Exception { // 读取User类的字节码文件,创建一个字节码对象 Class<?> clazz = Class.forName("com.bwhuili.entity.User"); // 利用字节码对象创建User对象 User user = (User) clazz.newInstance(); // 相当于调用无参构造器 // 通过构造器创建对象 // Class<?>[] parameterTypes = { String.class, String.class, // String.class, // Boolean.class, Double.class, Integer.class }; Constructor<?> constructor = clazz.getDeclaredConstructor(String.class); // (相当于调用有参构造器) User user2 = (User) constructor.newInstance("张三"); System.out.println(user); } } |
1.2 反射机制获取属性名和值:
public class Reflect02 { /** * 反射机制获取属性名和值 */ public static void main(String[] args) throws Exception { String className = "com.bwhuili.entity.User"; Class<?> clazz = Class.forName(className); User user = (User) clazz.newInstance(); // 动态创建User对象 // 获取对象中的所有属性名称 Field[] fields = clazz.getDeclaredFields(); // 使用增强for循环遍历数组 for (Field field : fields) { // 设置强制访问 field.setAccessible(true); // 属性名称 String name = field.getName(); // 属性值 Object value = field.get(user); System.out.println("name:" + name + ",value:" + value); } } } |
1.3 反射机制获取方法:
public class Reflect03 { /* * 反射机制获取方法 */ public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("com.bwhuili.entity.User"); User user = (User) clazz.newInstance(); // 创建User对象 // 获取user对象中的setSalary()方法 Method method = clazz.getDeclaredMethod("setSalary", Double.class); // 相当于调用setSalary()方法,把9700.00赋给salary method.invoke(user, 9700.00); System.out.println(user); } } |
1.4 反射的实例:
public class ReadXMLFile<T> { public List<T> read(String xmlName, T t) throws Exception { // 读取users.xml List<T> list = new ArrayList<T>(); // 1.创建一个xml解析器对象 SAXReader reader = new SAXReader(); // 2.读取xml文件,返回Document对象 Document document = null; try { document = reader.read(new File(xmlName)); } catch (DocumentException e) { e.printStackTrace(); } // 3.解析 Element root = document.getRootElement(); // 根节点 Iterator<Node> iterator = root.nodeIterator(); // 子节点的迭代器 while (iterator.hasNext()) { Node node = (Node) iterator.next(); if (node instanceof Element) { Element element = (Element) node; /* User user = new User(); */ Class<?> clazz = t.getClass(); // 获取到泛型T的字节码文件 Object object = clazz.newInstance(); // 利用反射动态创建对象 Iterator<Node> iterator2 = element.nodeIterator(); while (iterator2.hasNext()) { Node node2 = iterator2.next(); // 叶子节点 String name = node2.getName(); // 节点名称 if (node2 instanceof Element) { Element element2 = (Element) node2; String value = element2.getText(); // 节点中的值 // 调用setXXXX(...)给对象obejct初始化 // 拼接set方法,组成Method类型的对象,调用invoke String methodName = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1); // set方法名称 String type = element2.attributeValue("type"); // set方法的参数类型 // 利用反射机制获取set方法,并调用Method的invoke给对象初始化 Method setMethod = clazz.getMethod(methodName, Class.forName(type)); if ("java.lang.String".equals(type)) { setMethod.invoke(object, value); } else if ("java.lang.Boolean".equals(type)) { setMethod.invoke(object, "1".equals(value) ? true : false); } else if ("java.lang.Double".equals(type)) { setMethod.invoke(object, Double.valueOf(value)); } else if ("java.lang.Integer".equals(type)) { setMethod.invoke(object, Integer.parseInt(value)); } else { } } } list.add((T) object); } } return list; } } |
- web理论基础和开发工具:
2.1 软件结构
C/S:Client-Server
B/S:Browser-Server
JavaWeb属于B/S结构。
2.2 服务器:
从物理的角度,就是PC机(8核,8G,256G)。
Web服务器:在PC机上安装web服务软件。
Web服务器软件:
作用:把本地的资源共享给外部使用。
Tomcat:Apache,免费,支持J2EE开发。
Jetty:Scala开发使用比较多。
WebLogic:BEA公司
JBoss:收费
WebSphare:IBM
数据库服务器:安装数据库服务软件的服务器。
2.3 web项目的结构:
注意:
1、src和WebRoot可以在创建工程的时候自定义,不同的工具(如Intillij IDEA)新建的web项目也名称会有不同。
2、WEB-INF目录中的文件资源不能通过浏览器直接访问。
2.4 Tomcat服务器软件(中间件):
2.4.1 配置:
2.4.2 Tomcat的使用:
1、项目发布和Tomcat的启停:
发布:
启动/停止/重启:
2、url:
统一资源定位符
http://localhost:8080/Day28_Demo/index.jsp
http:// 访问协议
localhost 本地域名,指代127.0.0.1
8080 Tomcat服务的端口号
Day28_Demo web应用的发布名称,默认情况下到Tomcat的webapps目录下
Index.jsp 资源的名称
3、Tomcat的目录结构:
http://localhost:8080/实际上访问的是Tomcat路径之下的ROOT/index.jsp。如果发布项目时,不希望在浏览器url中出现项目名称,可以直接把项目的发布路径改成ROOT。
- Servlet的开发:
3.1 初始Servlet:
静态资源:当用户多次访问这个资源,资源的代码不会发生变化,比如html。
动态资源:当用户多次访问这个资源,资源的代码可能发生变化。
Servlet:用java语言编写的动态资源开发技术。
3.2 Servlet手动开发入门程序:
1、定义一个HelloWorldServlet类,继承HttpServlet,重写doGet()和doPost方法:
public class HelloWorldServlet extends HttpServlet { /* * 如果浏览器的url没有指定请求方式,默认是get,调用doGet()方法 */ @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); // 向浏览器输出内容 response.getWriter().write( "Hello world!这是我的第一个Servlet程序,当前的时间为:" + new Date()); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
2、在web.xml文件中配置Servlet:
<!-- 配置HelloWorldServlet --> <servlet> <!-- Servlet程序的名称 --> <servlet-name>HelloWorld</servlet-name> <!-- Servlet的实际包名和类名 --> <servlet-class>com.bwhuili.servlet.HelloWorldServlet</servlet-class> </servlet> <!-- 配置Servlet的映射 --> <servlet-mapping> <!-- Servlet程序的名称 --> <servlet-name>HelloWorld</servlet-name> <!-- Servlet的访问路径 --> <url-pattern>/hello</url-pattern> </servlet-mapping> |
3、发布项目到Tomcat
4、启动Tomcat服务器:
http://localhost:8080/Day28_Demo/hello
3.3 Servle的工具开发:
在创建Servlet程序时,直接new->Servlet,可以在弹出框中填写Servlet的类名、包名、修改url和指定要重写的方法(如doGet()、doPost()等)。(Display Name和Description的内容一般设置为空)
默认会自动生成指定的Servlet类以及重写指定的方法,会在web.xml文件中配置相应的Servlet。
四、Servelt的原理:
4.1 Servlet的执行过程:
1、Tomcat服务器启动的时候,会读取web.xml文件,并且把其中的配置信息写入内存;
2、当在浏览器通过url访问这个Servlet时,会去内存中找该Servlet对应的配置信息;
3、调用servlet中的方法(如果使用了form表单提交,method指定的请求方式为get)(默认)则调用doGet()方法,请求方式为post则调用doPost()方法;否则直接调用doGet()方法)
Java程序的总入口:main方法
Javaweb项目的总入口:web.xml
Javaweb项目用户操作的入口:页面(jsp/html/Servlet)
4.2 Servlet的生命周期:
Servlet的加载----->实例化----->服务------>销毁
构造方法:创建Servlet对象的时候调用,默认情况下,是在第一次访问该Servlet时创建一个对象,只调用一次。(Servlet对象在Tomcat中是单例的)
Init()方法:创建完Servlet对象之后调用一次,只会调用一次。
service()方法:每次从浏览器发出请求时调用,调用多次。从表面看,就是调用doGet()或doPost()方法,具体调用哪一个是由请求方式决定。
destroy()方法:销毁对象的时候调用。停止Tomcat服务器时会销毁,只会调用一次。
五、Servlet的入门应用:
实现一个用户登录功能。
5.1 页面开发:
编写登录表单,设置整个页面的样式(css),实现表单提交的校验(js)
Html: |
<!DOCTYPE html> <html> <head> <title>登录页面</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css"> <script type="text/javascript" src="js/login.js"></script> </head> <body> <form action="login.do" method="post" onsubmit="return check();"> <table border="1" cellspacing="0" width="400" align="center" id="table"> <tr> <td> <table border="0" cellspacing="0" cellpadding="10"> <tr> <td width="100" class="title">账号:</td> <td width="300"><input type="text" name="account" id="account"/><i style="color:red;" id="msg1"></i></td> </tr> <tr> <td class="title">密码:</td> <td><input type="password" name="password" id="password"/><i style="color:red;" id="msg2"></i></td> </tr> <tr> <td class="title">确认密码:</td> <td><input type="password" name="rePassword" id="rePassword"/><i style="color:red;" id="msg3"></i></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="登录"/> <input type="reset" value="取消"/> </td> </tr> </table> </td> </tr> </table> </form> </body> </html> |
css/style.css |
.title{ text-align: right; } #table{ margin-top:200px; } |
js/login.js |
function check(){ document.getElementById("msg1").innerHTML = ""; document.getElementById("msg2").innerHTML = ""; document.getElementById("msg3").innerHTML = ""; //分别获取三个input输入框对应的标签 var accountEle = document.getElementById("account"); var passwordEle = document.getElementById("password"); var rePasswordEle = document.getElementById("rePassword"); //分别获取三个输入框的值 var account = accountEle.value.trim(); //trim()去掉首尾的空格 var password = passwordEle.value.trim(); var rePassword = rePasswordEle.value.trim(); if(account==null||account==""){ document.getElementById("msg1").innerHTML = "请输入..."; accountEle.focus(); return false; } if(password==null||password==""){ document.getElementById("msg2").innerHTML = "请输入..."; passwordEle.focus(); return false; } if(password!=rePassword){ document.getElementById("msg3").innerHTML = "密码不一致!"; rePasswordEle.focus(); return false; } return true; } |
5.2 Servlet后端开发:
AdminServlet.java |
public class AdminServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 登录校验: * 1.接收页面发送到服务器的数据(账号、密码) * 2.从数据库根据账号查询用户 * 3.看从数据库中查询的到的用户数据是否跟输入一致(有可能用户不存在;有可能用户存在,但是密码不一致;有可能用户存在,并且密码一致) * 4.根据校验的结果跳转页面(?) */ request.setCharacterEncoding("UTF-8"); // 1、接收页面数据 String account = request.getParameter("account").trim(); // trim()去掉首尾的空格 String password = request.getParameter("password").trim(); // System.out.println("acc:" + account + ",pwd:" + password); // 2、考虑到目前没有数据库,可以暂时定义List集合虚拟一个数据库 List<Admin> admins = new ArrayList<Admin>(); admins.add(new Admin("张三", "1234")); admins.add(new Admin("俊杰", "4321")); admins.add(new Admin("ouyang12", "8866")); Admin dbAdmin = null; // 存储从数据库中查询到的账户对应的用户 for (Admin ad : admins) { if (account.equals(ad.getAccount())) { // 从数据库中找个该账号对应的用户 dbAdmin = ad; } } // 3、校验: if (dbAdmin == null) { // 账号不存在 System.out.println("账号不存在!"); } else { if (password.equals(dbAdmin.getPassword())) {// 账号存在,并且密码正确 System.out.println("登录成功!"); } else { System.out.println("密码错误!!!"); } } } } |
web.xml |
<servlet> <servlet-name>AdminServlet</servlet-name> <servlet-class>com.bwhuili.servlet.AdminServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AdminServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping> |
注意问题:
1、写一段就调试一段,看看效果。
2、注重思路,再逐步细化。