moluuser's Blog - Java
type: channel
link: https://archive.moluuser.com/tag/Java
items: Android原生开发入门
items: Spring
items: MyBatis
items: Spring Boot入门
items: JavaWeb JNDI/连接池/自定义标签(5)
items: JavaWeb 过滤器/监听器/钝化活化/Ajax(4)
items: JavaWeb EL/JSTL(3)
items: Java反射
items: JavaWeb MVC/Servlet/三层架构(2)
items: JavaWeb 笔记(1)

Android原生开发入门
type: item
date: 2020-08-09T10:45:00+00:00
description: [scode type="share"]假期接了个Android App的项目，一开始想学着做原生的App，后来因为考虑到学习成本，用MUI框架开发。看了一点点原生App开发，记录下。[/scode]Begin项目目录结构HelloWorldUI设计使用图形界面进行设计，注意多分辨率设备的适配。生命周期package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { String TAG = "myTAG"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate: "); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart: "); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume: "); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause: "); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop: "); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart: "); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy: "); } }屏幕翻转的时候也会重新启动生命周期。控件入门通过ID修改Textpublic class MainActivity extends AppCompatActivity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView3); // R.drawable.xx; // R.raw.xx; // R.layout.xx; } @Override protected void onPause() { super.onPause(); textView.setText("Pause"); } }Button的监听器package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { TextView textView; Button button1, button2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView4); button1 = findViewById(R.id.button3); button2 = findViewById(R.id.b…

Spring
type: item
date: 2020-05-12T10:52:00+00:00
description: IoC控制反转反转的是获取对象的方式。传统 new对象，SpringIoC容器只需要 getBean("obj")从容器中获取(applicationContext.xml)为了方便理解，IoC改名为DI依赖注入两种理解：控制反转：将创建对象、属性值的方式 进行了反转，从 new、setObj()反转为了 从springIoC容器 getBean()依赖注入：将属性值注入给了属性，将属性注入给了 bean，将 bean注入给了IoC容器案例创建Student实例类package com.moluuser.entity; public class Student { private int stuNo; private String stuName; private int stuAge; public int getStuNo() { return stuNo; } public void setStuNo(int stuNo) { this.stuNo = stuNo; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public int getStuAge() { return stuAge; } public void setStuAge(int stuAge) { this.stuAge = stuAge; } @Override public String toString() { return "Student{" + "stuNo=" + stuNo + ", stuName='" + stuName + '\'' + ", stuAge=" + stuAge + '}'; } }applicationContext.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="student" class="com.moluuser.entity.Student"> <property name="stuName" value="zs"></property> <property name="stuAge" value="18"></property> <property name="stuNo" value="5"></property> </bean> </beans>测试类package com.moluuser.text; import com.moluuser.entity.Student; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.applet.AppletContext; public class Text { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Student student = (Student) context.getBean("student"); System.out.println(student.toString()); } }Add创建IoCpublic class Client { /** * 获取spring的Ioc核心容器，并根据id获取对象 * * ApplicationContext的三个常用实现类： * ClassPathXmlApplicationContext：它可以加载类路径下的配置文件，要求配置文件必须在类路径下。不在的话，加载不了。(更常用) * FileSystemXmlApplicationContex…

MyBatis
type: item
date: 2020-05-11T03:19:00+00:00
description: Begin前身iBatis，由Apache->GoogleMyBatis可以简化JDBC操作，实现数据的持久化。ORM对象-关系映射（Object/Relation Mapping，简称ORM），是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法，关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式，业务实体在内存中表现为对象，在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系，而在数据库中，关系数据无法直接表达多对多关联和继承关系。因此，对象-关系映射(ORM)系统一般以中间件的形式存在，主要实现程序对象到关系数据库数据的映射。MyBatis是ORM的一个实现，持久层框架。相关还有Hibernate, Spring Data JPA等ORM使得的开发人员像操作对象一样操作数据库表。MyBatis是一个优秀的基于java的持久层框架，它内部封装了jdbc，使开发者只需要关注SQL语句本身，而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。 MyBatis通过xml或注解的方式将要执行的各种statement配置起来，并通过java对象和statement中SQL的动态参数进行映射生成最终执行的SQL语句，最后由MyBatis框架执行SQL并将结果映射为java对象并返回。 采用ORM思想解决了实体和数据库映射的问题，对jdbc进行了封装，屏蔽了jdbc api底层访问细节，使我们不用与jdbc api打交道，就可以完成对数据库的持久化操作。MyBatis入门数据库准备DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` datetime default NULL COMMENT '生日', `sex` char(1) default NULL COMMENT '性别', `address` varchar(256) default NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');创建maven工程并导入坐标 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> </dependencies>创建实体类和dao的接口实体类：package com.moluuser; import java.io.Serializable; import java.util.Date; public class User implements Serializable { // 和数据库命名保持一致 private Integer id; private String username; private Date birthday; private String sex; private String address; @Override public String toString() { return "user{" + "id=" + id + ", username='" + username +…

Spring Boot入门
type: item
date: 2020-05-09T11:21:00+00:00
description: 简介简化Spring应用开发的一个框架整个Spring技术栈的一个大整合J2EE开发的一站式解决方案微服务一个应用应该是一组小型服务；可以通过HTTP的方式进行互通；单体应用：ALL IN ONE微服务：每一个功能元素最终都是一个可独立替换和独立升级的软件单元HelloWorld导入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>主程序package com.moluuser; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.Spring BootApplication; @SpringBootApplication public class HelloWorld { public static void main(String[] args) { SpringApplication.run(HelloWorld.class, args); } }Controllerpackage com.moluuser.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @ResponseBody @RequestMapping("/hello") public String hello() { return "Hello World"; } }Run部署加入插件 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>maven packagejava -jar packageName即可完成部署，不需要Tomcat环境HelloWorld解析POM文件导入依赖spring-boot-starter-parent是一个特殊的 starter，它用来提供相关的 Maven 默认依赖。 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent>其父工程 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent>spring-boot-dependencies定义了Spring Boot所有的依赖的版本Spring Boot的版本仲裁中心: 以后我们导入依赖默认是不需要写版本(没有在dependencies里面管理的依赖自然需要声明版本号)导入启动器 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencie…

JavaWeb JNDI/连接池/自定义标签(5)
type: item
date: 2020-05-09T08:38:00+00:00
description: JNDIJava命名与目录接口配置tomcat/conf/context.xml配置： <Environment name="jndiName" value="jndiValue" type="java.lang.String" />JSP中使用 <% Context ctx = new InitialContext() ; String testJndi = (String)ctx.lookup("java:comp/env/jndiName"); out.print(testJndi); %>连接池数据库连接池（Connection pooling）是程序启动时建立足够的数据库连接，并将这些连接组成一个连接池，由程序动态地对池中的连接进行申请，使用，释放。创建数据库连接是一个很耗时的操作，也容易对数据库造成安全隐患。所以，在程序初始化的时候，集中创建多个数据库连接，并把他们集中管理，供程序使用，可以保证较快的数据库读写速度，还更加安全可靠。常见连接池：Tomcat-dbcp、dbcp、c3p0、druid可以用数据源(javax.sql.DataSource)管理连接池Tomcat-dbcp配置数据源（context.xml）类似jndi,在context.xml中配置数据库 <Resource name="student" auth="Container" type="javax.sql.DataSource" maxActive="400" maxIdle="20" maxWait="5000" username="scott" password="tiger" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" />指定数据源（web.xml）在项目的 web.xml中配置 <resource-ref> <res-ref-name>student</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>用数据源通过数据库获取 Connection 更改连接对象Connection的获取方式传统JDBC方式connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);数据源方式Context ctx = new InitialContext() ;//context.xml DataSource ds = (DataSource)ctx.lookup("java:comp/env/student") ; connection = ds.getConnection();DBCP连接池用连接池的核心：将连接的指向改了，现在指向的是数据源而不是数据库。BasicDataSource方式（硬编码）DasicDataSource对象设置各种数据 //获取dbcp方式的ds对象 public static DataSource getDataSourceWIthDBCP(){ BasicDataSource dbcp = new BasicDataSource(); dbcp.setDriverClassName("oracle.jdbc.driver.OracleDriver"); dbcp.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL"); dbcp.setUsername("scott"); dbcp.setPassword("tiger"); dbcp.setInitialSize(20); dbcp.setMaxActive(10); return dbcp; }BasicDataSourceFactory方式配置方式（.properties文件, 编写方式key=value）dbcpconfig.properties public static DataSource getDataSourceWIthDBCPByProperties() throws Exception{ DataSource dbcp = null ; Properties props = new Properties(); InputStream input = new DBCPDemo().getClass().getClassLoader().getResourceAsStream("dbcpconfig.properties"); props.load…

JavaWeb 过滤器/监听器/钝化活化/Ajax(4)
type: item
date: 2020-05-09T03:39:00+00:00
description: 过滤器@WebFilter(urlPatterns = "/loginfolder/*") public class filterUser implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { javax.servlet.http.HttpServletRequest req = (javax.servlet.http.HttpServletRequest) servletRequest; javax.servlet.http.HttpSession session = req.getSession(); if (session.getAttribute("user") != null) { // System.out.print(session.getAttribute("user")); // 放行 filterChain.doFilter(servletRequest, servletResponse); } else { ((javax.servlet.http.HttpServletResponse) servletResponse).sendRedirect("../index.jsp"); } } @Override public void destroy() { } } @WebFilter注解以下所有属性均为可选属性，但是 value、urlPatterns、servletNames 三者必需至少包含一个，且 value 和 urlPatterns 不能共存，如果同时指定，通常忽略 value 的取值。@WebFilter的常用属性属性名类型描述filterNameString指定过滤器的 name 属性，等价于 <filter-name>valueString[]该属性等价于 urlPatterns 属性。但是两者不应该同时使用。urlPatternsString[]指定一组过滤器的 URL 匹配模式。等价于 <url-pattern> 标签。servletNamesString[]指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值，或者是 web.xml 中 <servlet-name> 的取值。dispatcherTypesDispatcherType指定过滤器的转发模式。具体取值包括：ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。initParamsWebInitParam[]指定一组过滤器初始化参数，等价于 <init-param> 标签。asyncSupportedboolean声明过滤器是否支持异步操作模式，等价于 <async-supported> 标签。descriptionString该过滤器的描述信息，等价于 <description> 标签。displayNameString该过滤器的显示名，通常配合工具使用，等价于 <display-name> 标签。dispatcher请求方式： REQUEST：拦截HTTP请求 get postFORWARD：只拦截通过请求转发方式的请求 INCLUDE:只拦截拦截通过 request.getRequestDispatcher("").include()、通过 <jsp:include page="..." />此种方式发出的请求 ERROR：只拦截 <error-page>发出的请求过滤器链可以配置多个过滤器，过滤器的先后顺序 是由 <filter-mapping>的位置决定监听器public class OnlineListener implements HttpSessionAttributeListener{ //编写添加和删除属性方法 public void attributeAdded(HttpSessionBindingEvent e) { UserList.addUser(String.valueOf(e.getValue())); System.out.println("session(" + e.getSession().getId() + ")增加属性" + e.getName() + "，值…

JavaWeb EL/JSTL(3)
type: item
date: 2020-05-08T10:24:00+00:00
description: EL表达式传统JSP中用Java代码显示数据的弊端：类型转换，需要处理 null目的：消除jsp中的Java代码语法：${EL表达式}EL不需要导包在EL中调用属性，其实是调用的getXxx()方法${范围.对象.属性.属性的属性}. ：使用方便[] ：如果是常量属性，需要使用双引号/单引号引起来;比点操作符更加强大[]优点：可以容纳一些特殊符号 ". ? -"[]可以容纳变量属性（可以动态赋值）String x = "a"; ${requestScope.a}等价于${requestScope["a"]}等价于${${requestScope[x]}可以处理数组 ${requestScope.arr[0]}EL隐含对象Scope对象(EL域对象)pageScope，requestScope，sessionScope，applicationScope变量用来访问存储在各个作用域层次的变量。如果不指定域对象，则默认根据从小到大顺序依次取值。param和paramValues对象param对象返回单一的字符串，而paramValues对象则返回一个字符串数组。$(param.name)$(paramValues.name[0])pageContext对象pageContext对象是JSP中pageContext对象的引用。通过pageContext对象，可以访问JSP中所有隐式对象。${pageContext} ${pageContext.request} ${pageContext.sessoin} ${pageContext.request.serverPort}方法名去掉括号和get并且首字母小写JSTL需要引入jar ：jstl.jarMaven配置 <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>引入tablib <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>在IDEA中配置Maven，在jsp前加上 <%@ page isELIgnored="false"%>才能正确解析EL表达式核心标签格式化标签SQL 标签XML 标签JSTL 函数核心标签<c:set>赋值I. 在某个作用域之中（4个范围对象），给某个变量赋值 <%-- request.setAttribute("name", "zhangsan") ; --%> <c:set var="name" value="zhangsan" scope="request"/> ${requestScope.name }<c:set var="变量名" value="变量值" scope="4个范围对象的作用域"/>II. 给普通对象赋值在某个作用域之中（4个范围对象），给某个对象的属性复制 （此种写法，不能指定scope属性） <c:set target="${requestScope.student}" property="sname" value="zxs" />III. 给map对象赋值 <c:set target="${requestScope.countries}" property="cn" value="中国" /><c:set target="对象" property="对象的属性" value="赋值" />注意 <c:set>可以给不存在的变量赋值 （但不能给不存在的对象赋值）<c:out>显示true:<c:out value='百度' default="当value为空的，显示的默认值" escapeXml="true" /> false： <c:out value='百度' escapeXml="false" />显示如下：<c:remove >删除属性<c:remove var="a" scope="request"/>删除request域中删除a变量选择语句<c:if test="${1>0}" scope="request" var="result"> true </c:if>result存储判断的bool值多重if：<c:choose> <c:when test=""></c:when> <c:when test=""></c:when> <c:otherwise></c:otherwise> </c:choose>在使用 test=""一定要注意后面是否有空格迭代<c:forEach begin="0" end="5" step="1" varStatus="status"> ${status.ind…

Java反射
type: item
date: 2020-05-08T06:42:00+00:00
description: Begin反射机制是在运行状态中:对于任意一个类，都能够知道这个类的所有属性和方法;对于任意一个对象，都能够调用它的任意一个方法和属性;反射提供的功能：在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。获取反射对象package reflect; public class reflectDemo1 { public static void main(String[] args) { // 获取反射对象（反射入口） // 1. Class.forName(全类名) try { Class<?> perClazz1 = Class.forName("reflect.Person"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 2. 类名.class Class<?> perClazz2 = reflect.Person.class; // 3. 对象.getClass() Person per = new Person(); Class<?> perClazz3 = per.getClass(); } }package reflect; public class Person implements MyInterface { public Person() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public static void staticMethod() { System.out.println("staticMethod"); } public Person(int id) { this.id = id; } public Person(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } private void privateMethod() { System.out.println("privateMethod"); } private void privateMethod(String s) { System.out.println(s); } private int id; private String name; private int age; @Override public void interfaceMethod() { System.out.println("interfaceMethod"); } }Java泛型中的通配符<?>称为非受限通配，其实就相当于 <? extends Object>，可以表示任何一种对象类型<? extends T>称为受限通配，表示需要的是T或者T的子类型<? super T>称为下限通配，表示需要的是T的父类型断言assert <boolean表达式>如果<boolean表达式>为 true，则程序继续执行。如果为 false，则程序抛出 AssertionError，并终止执行。assert <boolean表达式> : <错误信息表达式> 如果 <boolean表达式>为 true，则程序继续执行。如果为 false，则程序抛出 java.lang.AssertionError，并输入 <错误信息表达式>。 <错误信息表达式>表示一个基本类型、表达式或者是一个 Object，用于在失败时输出错误信息。获取Class的内容 // Class入口 Class<?> perClazz1 = null; try { perClazz1 = Class.forName("reflect.Person"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 获取所有公共方法(本类及父类，接口中的方法且符合访问修饰符规则) assert perClazz1 != null; Method[] methods = perClazz1.…

JavaWeb MVC/Servlet/三层架构(2)
type: item
date: 2020-05-07T03:17:00+00:00
description: MVC设计模式M：Mode，模型：一个功能。用JavaBean实现。V：View，视图：用于展示、以及与用户交互。使用html js css jsp jquery等前端技术实现。C：Controller，控制器：接受请求，将请求跳转到模型进行处理。模型处理完毕后，再将处理的结果返回给请求处。可以用jsp实现，但是一般建议使用Servlet实现控制器。ServletJava类符合以下规范：必须继承 javax.servlet.http.HttpServlet重写其中的 doGet()或 doPost()方法doGet()：接受并处理所有get提交方式的请求doPost()：接受并处理所有post提交方式的请求配置Serlvet2.5需要配置 web.xml <servlet> <servlet-name>WelcomeServlet</servlet-name> <servlet-class>org.lanqiao.servlet.WelcomeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>WelcomeServlet</servlet-name> <url-pattern>/WelcomeServlet</url-pattern> </servlet-mapping>Servlet执行流程：请求 -> <url-pattern> -> 根据 <servlet-mapping>中的 <servlet-name> 去匹配 <servlet> 中的 <servlet-name> 然后寻找到 <servlet-class> 中将请求交由该 <servlet-class>执行。手工创建Servlet创建一个类，继承 HttpServlet重写 doGet()、doPost()方法配置 web.xml中的Servlet映射关系Servlet3.0+要在Servlet类的定义处之上编写注解@WebServlet("url-pattern的值")匹配流程：请求地址与@WebServlet中的值进行匹配，如果匹配成功，则说明请求的就是该注解所对应的类。@WebServlet(name = "HelloServlet", urlPatterns = "/HelloServlet") public class HelloServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doPost"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doGet"); } }Servlet注解配置细节属性名类型描述nameString指定Servlet 的 name 属性，等价于 <servlet-name>。如果没有显式指定，则该 Servlet 的取值即为类的全限定名。valueString[]该属性等价于 urlPatterns 属性。两个属性不能同时使用。urlPatternsString[]指定一组 Servlet 的 URL 匹配模式。等价于 <url-pattern>标签。loadOnStartupint指定 Servlet 的加载顺序，等价于 <load-on-startup>标签。initParamsWebInitParam[]指定一组 Servlet 初始化参数，等价于 <init-param>标签。asyncSupportedboolean声明 Servlet 是否支持异步操作模式，等价于 <async-supported>标签。descriptionString该 Servlet 的描述信息，等价于 <description>标签。displayNameString该 Servlet 的显示名，通常配合工具使用，等价于 <display-name>标签。注意字符串要有 /，可以只传一个参数，默认为 value路径web.xml中的 /：代表项目根路径 (ip:port/projec)jsp中的 /：服务器根路径 (ip:port)Servlet生命周期5个阶段加载初始化：init()，该方法会在 Servlet被加载并实例化的以后 执行服务：s…

JavaWeb 笔记(1)
type: item
date: 2020-05-01T10:35:00+00:00
description: 前言Java基础语法的坑补上了，开始学JSP啦希望头发不会少...QWQBeginJSP页面元素<%局部变量、java语句%><%!全局变量、定义方法%><%=输出表达式 %>page指令page指定的属性：language:jsp页面使用的脚本语言import:导入类pageEncoding:jsp文件自身编码contentType:浏览器解析jsp的编码<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>注释html注释 ,用户可通过浏览器查看源码查看。java注释 //， /*...*/jsp注释 <%-- --%>常见状态码200：一切正常300/301: 页面重定向 （跳转）404: 资源不存在403：权限不足 （如果访问a目录，但是a目录设置 不可见）500：服务器内部错误（代码有误）设置初始页面在项目/WEB-INF/web.xml中设置 默认的 初始页面<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>虚拟路径方法一：将web项目配置到webapps以外的目录在conf/server.xml中配置host标签中：<Context docBase="D:\study\JspProject" path="/JspProject" />docBase：实际路径path：虚拟路径 （绝对路径、相对路径（相对于webapps））重启方式二：在apacheconfCatalinalocalhost中新建“项目名.xml”中新增一行：<Context docBase="D:\study\JspProject" path="/JspProject" />虚拟主机通过www.test.com访问本机方法一：修改 conf/server.xml <Engine name="Catalina" defaultHost="www.test.com"> <Host appBase="D:\study\JspProject" name="www.test.com"> <Context docBase="D:\study\JspProject" path="/"/> </Host>方法二：在C:WindowsSystem32driversetchost增加127.0.0.1 www.test.com内置对象out输出对象，向客户端输出内容request请求对象；存储“客户端向服务端发送的请求信息”常见方法：String getParameter(String name) :根据请求的字段名key （input标签的name属性值） ，返回字段值value （input标签的value属性值）String[] getParameterValues(String name): 根据请求的字段名key ，返回多个字段值value （checkbox）void setCharacterEncoding("编码格式utf-8") ：设置post方式的请求编码 （tomcat7以前默认iso-8859-1，tomcat8以后改为了utf-8）getRequestDispatcher("b.jsp").forward(request,response) ; ：请求转发 的方式跳转页面 A - > BServletContext getServerContext():获取项目的ServletContext对象注意：get与post请求方式的区别：get方式 在地址栏显示 请求信息 (但是地址栏能够容纳的 信息有限，4-5KB；如果请求数据存在大文件，图片等 会出现地址栏无法容纳全部的数据而出错)，post不会显示文件上传操作，必须是post修改server.xml ，一次性的 更改tomcat默认get提交方式的编码 （utf-8）建议 使用tomcat时，首先在server.xml中统一get方式的编码 URIEncoding="UTF-8"推荐使用post。response：响应对象常见方法：void addCookie( Cookie cookie ); 服务端向客户端增加cookie对象void sendRedirect(String location ) throws IOException; :页面跳转的一种方式（重定向）void setContetType(String type):设置服务端响应的编码（设置服务端的contentType类型） 请求转发重定向地址栏是否改变不变改变是否保留第一次请求数据保留不保留请求次…